面试题:truncate和delete的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l_mloveforever/article/details/82107174

前提:

今天在听面试录音的时候,get到了这样一个问题:有一张表有一亿的数据,现在让你删除其中五千万条数据,你会用什么方法?

这就需要用truncate table来搞定了,如下:

select 5条数据 into #临时表 from 1亿条数据的牛X表

truncate table 1亿条数据的牛X表     

insert 1亿条数据的牛X表 select * from #临时表

drop table #临时表

解析:

truncate和 delete只删除数据不删除表的结构(定义) ; drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.

1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。

2、truncate不能进行回滚操作。

3、truncate不触发任何delete触发器。

5、当表被truncate后,这个表和索引所占用的空间会恢复到初始大小,而delete操作不会减少表或索引所占用的空间。

6、不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。
    DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。

小结:
    TRUNCATE TABLE 则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

DELETE语句可以通过WHERE对要删除的记录进行选择。而使用TRUNCATE TABLE将删除表中的所有记录。因此,DELETE语句更灵活。如果DELETE不加WHERE子句, DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。如果一个表中有自增字段,使用TRUNCATE TABLE和没有WHERE子句的DELETE删除所有记录后,这个自增字段将起始值恢复成1.如果你不想这样做的话,可以在DELETE语句中加上永真的WHERE,如WHERE 1或WHERE true。DELETE FROM table1 WHERE 1;

猜你喜欢

转载自blog.csdn.net/l_mloveforever/article/details/82107174
今日推荐