DELETE与TRUNCATE的区别
当执行 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的区别的更多相关文章
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
- Delete和Truncate的区别
原文:Delete和Truncate的区别 一般对于没有用的数据,都会经行删除,而删除通常使用的是DELETE和TRUNCATE命令.对于有条件地删除,基本上就会使用DELETE,当然还是没有绝对,用 ...
- 数据库中drop、delete与truncate的区别
数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...
- mysql 删除表记录 delete和truncate table区别
MySQL中删除表记录delete from和truncate table的用法区别: mysql中有两种删除表中记录的方法: (1)delete from语句, (2)truncate table语 ...
- SQL Server中DELETE和TRUNCATE的区别
DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一.这两条语句都可以从表中删除数据.然而,也有不同之处. 本文将重点讨论这些差异,并通过实例加以说明. TRUNCATE DEL ...
- 详解Oracle DELETE和TRUNCATE 的区别(摘)
语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...
- MySQL中drop,delete与truncate的区别
drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句. (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将 ...
- 详解Oracle DELETE和TRUNCATE 的区别
原文地址:http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html 语法delete from aa truncate tab ...
- ORACLE中DELETE和TRUNCATE的区别
语法 delete from AA truncate table AA 区别 1.delete from后面可以写条件(也就是where子句,delete from AA where aa.列名 = ...
- Oracle DELETE和TRUNCATE 的区别
语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...
随机推荐
- ASP.NET获取工程根目录的方法集合
1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory //取得或设置当前工作目录的完整限定路径 方法2.AppDomain.CurrentDomain. ...
- js Memoization 优化运行速度
项目中需要用到 大计算量 耗时的js运算. Memoize 是一个优化方法 ,对耗时的递归运算,漫长的查找运算的结果进行缓存,使运行时间最小化 原理是缓存先前的结果计算值从而可以避免需要重新计算 ...
- busybox rootfs 启动脚本分析(一)
imx6文件系统启动脚本分析.开机运行/sbin/init,读取/etc/inittab文件,进行初始化. 参考链接 http://blog.163.com/wghbeyond@126/blog/st ...
- LeetCode Flatten 2D Vector
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
- MVC 区域功能
因为MVC项目是要求都放在固定的文件夹,所以,当项目大的时候,会很不方便管理,所以微软引入的区域的功能 使用方法: 在项目上右击--添加--区域 就会出现Areas的文件夹,里面就是子MVC 渲染: ...
- 修改git commit默认触发的编辑器
使用git commit会自动启动编辑器编辑本次提交的comment,git默认配置是GNU nano,但是很多人不是很熟悉(我就是),其实这个是可以自行配置的. 编辑制定代码库的.git/confi ...
- 从Spring容器中获取Bean。ApplicationContextAware
引言:我们从几个方面有逻辑的讲述如何从Spring容器中获取Bean.(新手勿喷) 1.我们的目的是什么? 2.方法是什么(可变的细节)? 3.方法的原理是什么(不变的本质)? 1.我们的目的是什么? ...
- paper 104: 彩色图像高速模糊的懒惰算法
工程及源代码:快速模糊.rar 图像模糊算法有很多种,我们最常见的就是均值模糊,即取一定半径内的像素值之平均值作为当前点的新的像素值,在一般的工业 ...
- vs extension
优先级高低
- win8win10以管理员身份运行cmd方法
win8win10以管理员身份运行cmd方法 Win7/8下提示OpenSCManager failed 拒绝访问Maven nexus 安装nexus : wrapper | OpenSCManag ...