首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server,使用truncate的临时表与使用delete的table变量

SQL Server,使用truncate的临时表与使用delete的table变量
EN

Stack Overflow用户
提问于 2010-04-15 23:32:51
回答 2查看 51.7K关注 0票数 7

我有一个存储过程,我在其中创建了一个临时表,通常包含1到10行。在存储过程中,该表被多次截断和填充。它被截断,因为这比delete更快。当我因为使用delete而遭受惩罚时(truncate对表变量无效),通过用表变量替换这个临时表,我的性能是否会有所提高?

虽然表变量主要在内存中,并且通常比临时表更快,但我是否会因为必须删除而不是截断而失去任何好处?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-15 23:41:44

运行下面的脚本,似乎Table变量是更好的选择

代码语言:javascript
运行
复制
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事件探查器

代码语言:javascript
运行
复制
CPU     Reads   Writes  Duration
36375     2799937   0       39319

vs

CPU     Reads   Writes  Duration
14750   1700031 2       17376   
票数 14
EN

Stack Overflow用户

发布于 2010-04-16 00:31:01

坦率地说,只有10或20 (甚至100)个条目,速度上的任何差异都在亚纳秒级范围内。忘了它吧--甚至不要浪费你的大脑时间在这上面--这不是问题!

总体而言

  • 表变量将以一定的大小保存在内存中-如果超过这个大小,它们也会被交换到tempdb数据库中的磁盘-就像临时表一样。另外:如果一个临时表只有几个条目,那么它们很可能只存储在一个8k的页面上,只要您访问其中一个条目,整个页面(也就是整个临时表)都会在SQL Server内存中-所以即使在这里,表variables...
  • table变量也不会有太多的好处不支持索引或统计,这意味着如果您有很多条目,特别是如果您需要搜索和查询这个“实体”,最好使用一个临时表

总而言之:我个人使用临时表比使用表变量更多,特别是当我有10个以上的条目或类似的东西时。在性能方面,能够索引临时表并对其进行统计,通常会比表变量可能具有的任何潜在收益带来巨大的时间回报。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2646695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档