当执行 DELETE FROM TABLE后,会发现针对一个DELETE语句,该表中有多少行内容,数据库日志文件中,相对应的记录是就是多少条,每一条记录,对应的是行级别的删除。而且对应的LSN编号也是不同的。因为整个DELETE语句是一个事务,所以事务编号是相同的。

  使用命令 TRUNCATE TABLE TEST来删除表,在日志文件中是找不到相应的记录的。这是因为Truncate这个命令所运行的操作,是不记录日志的。如果表有成千上万条纪录,建议使用TRUNCATE TABLE来删除整张表。这样,可以避免日志文件大量的增长,同样,因为TRUNCATE TABLE命令在日志文件没有记录,所以使用TRUNCATE TABLE命令删除表后,如果突然发现是误操作,想依靠日志备份,表是无法恢复到原来状态的。因为没有办法做Undo操作。

因此可以发现,SQL Server的日志记录有以下特点:

1.   日志记录的是数据的变化,而不是记录用户发过来的操作。

在这一点上,日志记录的定位很清楚。它只是为了保证数据库一致性。所以它记录的信息对SQL Server来讲很有意义。但是如果想要通过它来倒推出用户刚才发过来的语句,可以说是不太可能的。

2.   每条记录都有它唯一的编号(LSN),并且记录了它属于的事务号。

这种设计便于事务的重新提交和回滚。

3.   日志记录的行数和实际修改的数据量有关。

SQL Server会为每一条记录的修改保存日志记录。如果单个语句修改的行数非常多,那它所带来的日志行数也就会非常多。所以日志增长的速度不仅和事务的多少有关,还和事务所带来的数据的修改量有关。

4.   日志记录了事务发生的时间,但是不记录发起者的程序名称和客户端信息。

5.   SQL Server能够从日志记录里面读到数据修改前的值和修改后的值。但是对管理者来讲,直接从日志记录里面是很难了解其修改过程的。

讨论这些的原因,是因为很多用户希望能从日志文件里倒推出数据库曾经发生的异常操作。比如,是哪个应用程序恶意或不小心删掉了一些重要数据,或者是哪个客户端在某个时间段发起了一个庞大的事务。由于SQL Server日志定位不是做用户行为监视和记录,而是在对性能影响最小的前提下保证事务一致性,所以它记录的内容是面向数据库服务,而不是面向用户的。换句话说,它记录的东西只要SQL Server自己能读懂就可以了,而没有考虑要给用户去访问和理解。一般情况下,使用者很难用事务日志来达到倒推的目的。所以如果要监视用户的行为,还是要开启SQL Server自己的监视工具,比如SQL Trace或XEvents等。

DELETE与TRUNCATE的区别的更多相关文章

  1. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  2. Delete和Truncate的区别

    原文:Delete和Truncate的区别 一般对于没有用的数据,都会经行删除,而删除通常使用的是DELETE和TRUNCATE命令.对于有条件地删除,基本上就会使用DELETE,当然还是没有绝对,用 ...

  3. 数据库中drop、delete与truncate的区别

    数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...

  4. mysql 删除表记录 delete和truncate table区别

    MySQL中删除表记录delete from和truncate table的用法区别: mysql中有两种删除表中记录的方法: (1)delete from语句, (2)truncate table语 ...

  5. SQL Server中DELETE和TRUNCATE的区别

    ​DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一.这两条语句都可以从表中删除数据.然而,也有不同之处. 本文将重点讨论这些差异,并通过实例加以说明. TRUNCATE DEL ...

  6. 详解Oracle DELETE和TRUNCATE 的区别(摘)

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...

  7. MySQL中drop,delete与truncate的区别

    drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句. (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将 ...

  8. 详解Oracle DELETE和TRUNCATE 的区别

    原文地址:http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html 语法delete from aa truncate tab ...

  9. ORACLE中DELETE和TRUNCATE的区别

    语法 delete from AA truncate table AA 区别 1.delete from后面可以写条件(也就是where子句,delete from AA where aa.列名 = ...

  10. Oracle DELETE和TRUNCATE 的区别

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...

随机推荐

  1. LeetCode Count of Smaller Numbers After Self

    原题链接在这里:https://leetcode.com/problems/count-of-smaller-numbers-after-self/ 题目: You are given an inte ...

  2. sql操作之修改表结构

    修改表的语法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列类型 列参数[加的 ...

  3. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

  4. Python之路-python(面向对象一)

    一.面向对象介绍 二.为什么要用面向对象开发 三.封装.继承.多态.类.方法 面向过程和面向对象的区别 编程范式: 一般情况下,拿到一个项目不同的两个人有不同的编写方式(相同的是固定的语法.数据结构) ...

  5. 使用复合索引代替单键索引,来避免单键有null值的情况

    查看原表: SQL> select count(*) from t1; COUNT(*) ---------- 3229088 SQL> select count(*) from t1 w ...

  6. Leetcode: Battleships in a Board

    Given an 2D board, count how many different battleships are in it. The battleships are represented w ...

  7. C# “快捷方式” 实现程序开机启动

    添加引用: COM : Windows Script Host Object Model Name: Interop.IWshRuntimeLibrary 添加命名空间: using IWshRunt ...

  8. 夺命雷公狗-----React---4--props变量的传递

    提示:props的值是不可以改变的... <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. c3p0数据库连接池使用

  10. CAN总线抓包

    马六: 由此可见, 马6的7e9跟7e8反馈的数据差不太多. 而标志508反馈的情况则不同, 波箱跟发动机反馈完全不同: 宝马3的数据如下: 证明宝马也有7e8跟7ec, 但是貌似7e8是主流啊... ...