代码之家  ›  专栏  ›  技术社区  ›  Sergey Dev

临时表与表变量

  •  0
  • Sergey Dev  · 技术社区  · 1 年前

    临时表存储在磁盘上,表变量存储在内存中。这意味着写入临时表的速度应该明显较慢,因为写入磁盘的速度比写入RAM的速度慢。然而,当我检查下面的两个脚本时,发现它们的执行时间几乎相同900/1000,临时表出人意料地获胜。为什么?

    DROP TABLE #TEST
    
    Create Table #test
    (
        Id UNIQUEIDENTIFIER 
    )
    
    DECLARE @i INT = 1;
    
    WHILE @i < 1000
         BEGIN 
            INSERT INTO #test VALUES  (NEWID())
            SET @i = @i + 1;
        END
    

    以及

    DECLARE @table1 TABLE
    (
        Id UNIQUEIDENTIFIER 
    )
    DECLARE @i INT = 1;
    
    WHILE @i < 1000
         BEGIN 
            INSERT INTO @table1 VALUES  (NEWID())
            SET @i = @i + 1;
        END
    
    1 回复  |  直到 1 年前
        1
  •  4
  •   David Browne - Microsoft    1 年前

    假设 临时表存储在磁盘上,表变量存储在内存中。

    实验 当我检查下面的两个脚本时,发现它们的执行时间几乎相同

    结论 这个假设是不正确的。

    事实上,临时表并不是直接写入磁盘的,而是写入内存中的缓冲池,只有在内存不足时才会写入磁盘。

    在SQL Server 2014之前,加载临时表与大容量加载常规表共享代码路径,后者直接写入磁盘上的数据文件。但在现代版本中,临时表可能根本不会写入磁盘。