我有一个存储过程,我在其中创建一个临时表,通常包含1到10行.在存储过程中,此表被截断并填充多次.它被截断,因为它比删除更快.
当我因使用删除而遭受惩罚时(截断对表变量不起作用),我是否通过用表变量替换此临时表来获得性能提升?
当我因使用删除而遭受惩罚时(截断对表变量不起作用),我是否通过用表变量替换此临时表来获得性能提升?
虽然表变量主要在内存中,并且通常比临时表更快,但是我必须通过删除而不是截断来获得任何好处吗?
解决方法
对脚本运行followign,似乎表变量是更好的选择
CREATE TABLE #Temp( ID INT ) DECLARE @Int INT,@InnerInt INT SELECT @Int = 1,@InnerInt = 1 WHILE @Int < 50000 BEGIN WHILE @InnerInt < 10 BEGIN INSERT INTO #Temp SELECT @InnerInt SET @InnerInt = @InnerInt + 1 END SELECT @Int = @Int + 1,@InnerInt = 1 TRUNCATE TABLE #Temp END DROP TABLE #TEMP GO DECLARE @Temp TABLE( ID INT ) DECLARE @Int INT,@InnerInt = 1 WHILE @Int < 50000 BEGIN WHILE @InnerInt < 10 BEGIN INSERT INTO @Temp SELECT @InnerInt SET @InnerInt = @InnerInt + 1 END SELECT @Int = @Int + 1,@InnerInt = 1 DELETE FROM @Temp END
来自sql Profiler
cpu Reads Writes Duration 36375 2799937 0 39319 vs cpu Reads Writes Duration 14750 1700031 2 17376