在我工作的系统中有很多使用临时表的存储过程和 SQL 脚本。使用这些表后,最好删除它们。
我的许多同事(几乎所有人都比我更有经验)通常会这样做:
TRUNCATE TABLE #mytemp
DROP TABLE #mytemp
Run Code Online (Sandbox Code Playgroud)
我通常DROP TABLE在我的脚本中使用单个。
在 aTRUNCATE之前立即执行 a 有什么好的理由DROP吗?
我错误地从远程 SQL Server 2008 表中删除了大约 2,000,000 条记录。服务器未授予我访问服务器端备份文件的权限。
有什么办法可以找回这些记录吗?
最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了 - 性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。
@Table Variable #Temp (delete) #Temp (truncate)
--------------- -------------- ----------------
5723 5180 5506
15636 14746 7800
14506 14300 5583
14030 15460 5386
16706 16186 5360
Run Code Online (Sandbox Code Playgroud)
只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka GetDate()) 是在语句时使用的,而不是批处理时,因此 TRUNCATE/DELETE 与SET @StartTime = CURRENT_TIMESTAMP语句之间不应有交互。
select current_timestamp
waitfor delay '00:00:04'
select current_timestamp
-----------------------
2012-10-21 11:29:20.290
-----------------------
2012-10-21 11:29:24.290
Run Code Online (Sandbox Code Playgroud)
当使用 DELETE 清除表时,第一次运行和后续运行之间的跳转非常一致。我对DELETE 的理解缺少什么?我已经重复了很多次,交换了顺序,调整了 tempdb 的大小以使其不需要增长等。
CREATE TABLE #values (
id int identity primary key, -- will be clustered …Run Code Online (Sandbox Code Playgroud) 什么是TRUNCATE做不同的下降?
我相信它会删除表中的所有数据,但将表名保留在数据库中,而 asDROP会删除所有数据和表。这样对吗 ?
sql-server ×3
truncate ×3
delete ×1
drop-table ×1
mysql ×1
oracle ×1
performance ×1
recovery ×1
sybase ×1