1
我目前正在將數據庫服務器從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
@marc_s:感謝編輯 – 2010-10-27 14:13:33