我们在两台机器上安装了相同的数据库。同桌。相同的索引。我正在运行一个自我加入的查询:
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.服务器会在同一个表设置上进行相同的查询(包括索引/碎片/统计信息),运行方式如此不同两个不同的服务器
答案 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更简单,并且不需要实现中间结果。