从SQL Server 2000升级到SQL Server 2008 R2时出现SQL查询问题
问题描述:
我目前正在将数据库服务器从SQL Server 2000升级到SQL Server 2008 R2。我的一个查询以前需要一秒钟才能运行,现在需要超过3分钟(使用更快的机器运行)。从SQL Server 2000升级到SQL Server 2008 R2时出现SQL查询问题
我想我已经找到了它出错的地方,但没有找到错误的原因。有人可以解释问题是什么以及我如何解决它?
删节的代码如下:
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为空或”线。如果我删除这个条件,它会像以前那样运行(不到一秒),并返回所有记录减去该语句将包含的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
答
尝试利用重组的CTE和ROW_NUMBER查询...
WITH txn AS (
SELECT registrarId, transactionid, ...
, ROW_NUMBER() OVER (PARTITION BY registrarid ORDER BY transactionid DESC) AS RowNum
FROM [Transaction]
)
SELECT
...
FROM
Registrar reg
JOIN EnabledType et ON et.enabledTypeCode = reg.enabled
LEFT JOIN txn ON txn.registrarId = reg.registrarId
AND txn.RowNum=1
@marc_s:感谢编辑 – 2010-10-27 14:13:33