SQL Server逻辑读取

时间:2016-07-21 13:09:11

标签: sql-server

我们在两台机器上安装了相同的数据库。同桌。相同的索引。我正在运行一个自我加入的查询:

   SELECT Column1 
         ,Column2 
         ,Column3
         ,Column4
         ,RowID    = RowNumber OVER ( Partition By Column1, ORDER BY Column2)
     INTO #tmp
     FROM AuditTable

   SELECT * 
     FROM #tmp t1 
     JOIN #tmp t2 ON t2.Column1 = t1.Column1 
                 AND t2.RowiD   = t1.RowID +1 

我们在一个数据库/服务器上运行此查询包含20,000行,并且需要2分钟才能完成逻辑读取大约320万次。
相同的查询在具有150,000条记录的不同数据库/服务器上运行,并在一秒钟内返回,逻辑读取为2240.服务器会在同一个表设置上进行相同的查询(包括索引/碎片/统计信息),运行方式如此不同两个不同的服务器

1 个答案:

答案 0 :(得分:1)

我不知道为什么您的服务器有不同的性能。

但是,在SQL Server 2012+中,您应该使用LAG()

SELECT Column1, Column2, Column3, Column4,
       LAG(Column2) OVER (PARTITION BY Column1 ORDER BY Column2) as prev_Column2,
       LAG(Column3) OVER (PARTITION BY Column1 ORDER BY Column2) as prev_Column3
FROM AuditTable;

而且,在SQL Server的版本中,您不应该使用临时表,除非您要为其添加索引以提高性能。 CTE更简单,并且不需要实现中间结果。