我目前正在将数据库服务器从 SQL Server 2000 升级到 SQL Server 2008 R2。我的一个查询过去需要不到一秒钟的时间才能运行,现在需要超过 3 分钟(在更快的机器上运行)。
我想我已经找到了出错的地方,但没有找到出错的原因。有人可以解释问题是什么以及我如何解决它吗?
删减的代码如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
...
FROM
Registrar reg
JOIN EnabledType et ON et.enabledTypeCode = reg.enabled
LEFT JOIN [Transaction] txn ON txn.registrarId = reg.registrarId
WHERE
txn.transactionid IS NULL OR
txn.transactionid IN
(
SELECT MAX(transactionid)
FROM [Transaction]
GROUP BY registrarid
)
我相信问题出在“txn.transactionid IS NULL OR”行。如果我删除此条件,它会像以前一样快(不到一秒)运行并返回所有记录减去该语句将包含的 3 行。如果我删除 OR 语句的第二部分,它会在不到一秒的时间内返回我期望的 3 行。
谁能指出我正确的方向,为什么会发生这种情况以及发生这种变化的时间?
提前谢谢了
乔纳森
我已经接受了 Alex 的解决方案并包含了新版本的代码。似乎我们发现 0.1% 的查询新的查询优化器运行速度较慢。
WITH txn AS (
SELECT registrarId, balance , ROW_NUMBER() OVER (PARTITION BY registrarid ORDER BY transactionid DESC) AS RowNum
FROM [Transaction]
)
SELECT
reg.registrarId,
reg.ianaId,
reg.registrarName,
reg.clientId,
reg.enabled,
ISNULL(txn.balance, 0.00) AS [balance],
reg.alertBalance,
reg.disableBalance,
et.enabledTypeName
FROM
Registrar reg
JOIN EnabledType et
ON et.enabledTypeCode = reg.enabled
LEFT JOIN txn
ON txn.registrarId = reg.registrarId
WHERE
ISNULL(txn.RowNum,1)=1
ORDER BY
registrarName ASC