我有一个存储过程,我在其中创建了一个临时表,通常包含1到10行。在存储过程中,该表被多次截断和填充。它被截断,因为这比delete更快。当我因为使用delete而遭受惩罚时(truncate对表变量无效),通过用表变量替换这个临时表,我的性能是否会有所提高?
虽然表变量主要在内存中,并且通常比临时表更快,但我是否会因为必须删除而不是截断而失去任何好处?
发布于 2010-04-15 15:41:44
运行下面的脚本,似乎Table变量是更好的选择
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 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
DELETE FROM @Temp
END
从Sql事件探查器
CPU Reads Writes Duration
36375 2799937 0 39319
vs
CPU Reads Writes Duration
14750 1700031 2 17376
发布于 2010-04-15 16:31:01
坦率地说,只有10或20 (甚至100)个条目,速度上的任何差异都在亚纳秒级范围内。忘了它吧--甚至不要浪费你的大脑时间在这上面--这不是问题!
总体而言
tempdb
数据库中的磁盘-就像临时表一样。另外:如果一个临时表只有几个条目,那么它们很可能只存储在一个8k的页面上,只要您访问其中一个条目,整个页面(也就是整个临时表)都会在SQL Server内存中-所以即使在这里,表variables...总而言之:我个人使用临时表比使用表变量更多,特别是当我有10个以上的条目或类似的东西时。在性能方面,能够索引临时表并对其进行统计,通常会比表变量可能具有的任何潜在收益带来巨大的时间回报。
https://stackoverflow.com/questions/2646695
复制