对临时表使用 truncate vs drop 的最佳实践
Posted
技术标签:
【中文标题】对临时表使用 truncate vs drop 的最佳实践【英文标题】:Best practices for using truncate vs drop for temp tables 【发布时间】:2014-06-05 19:07:19 【问题描述】:所以我一直在研究有关使用 TRUNCATE 与 DROP 的 SQL 标准。我的公司正在尝试确定我们是否应该在 DROP 之前使用 TRUNCATE 作为标准编码约定,或者我们是否应该只使用 DROP。通常,我们总是使用 TRUNCATE 和 DROP 而不仅仅是 DROP。
根据这个先前回答的问题,看起来没有理由同时使用两者: https://dba.stackexchange.com/questions/4163/why-use-both-truncate-and-drop
上面的链接还解决了使用 TRUNCATE 的问题,存在不必要的开销。
但是,由于似乎很多人仍然同时使用 TRUNCATE 和 DROP 而不是只使用 DROP,那么在 DROP 之前使用 TRUNCATE 有什么好处??
【问题讨论】:
使用 TRUNCATE 将删除除架构之外的所有行...使用 DROP 两者都消失了。那为什么要做额外的步骤。只需直接 DROP 表,这就是引入 DROP 的原因。 Morover,在 DROP 之前使用 TRUNCATE 根本不是任何标准......可能是一个低标准。 @Rahul 。 . .我认为从历史上看,DROP
首先存在,TRUNCATE
是作为一种效率机制被引入的,用于删除表中的所有行而不记录它们。否则,我同意你的评论。
如果我错了,请纠正我。您可以在 DROP
之后回滚,但在 TRUNCATE
之后无法回滚。
@LucM,虽然这是理论上的,但在某些地方我有红色(包括 OP 帖子中的链接),如果在 TRANS 块内使用,TRUNCATE/DROP 都可以回滚。
如果您了解 truncate 和 drop 在内部是如何工作的,我看不出在 drop 之前截断如何改进事情。你在这里的想法是什么? Drop 只是释放所有内容。如何提高效率?
【参考方案1】:
这取决于您的数据库、引擎和版本。
示例:现代版本的 mysql 通过执行 DROP 并重新创建表来执行 TRUNCATE。根据您可能遇到的错误,旧版本会从表中删除条目,这比删除表并重新创建要慢得多。这并不能解释为什么你会在 DROP 之前进行 TRUNCATE,而是为什么你会 DROP 并重新创建为 truncate 的优化版本。
其他数据库、引擎和版本可能有自己的特点。
如果没有理由对您当前的系统执行此操作,则可能是开发人员在其他系统上受此影响的一种行为。
【讨论】:
以上是关于对临时表使用 truncate vs drop 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
关于oracle里面delete,trancate,drop的区别和用法。详细点。谢谢
MySQL - 清空表数据 truncate;delete;drop