SQL Server 2000からSQL Server 2008 R2にアップグレードするときのSQLクエリの問題
-
26-09-2019 - |
質問
現在、SQL Server 2000からSQL Server 2008 R2にデータベースサーバーをアップグレードしています。私のクエリの1つは、走るのに1秒以内にかかっていましたが、現在は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はnullまたは " ライン。この条件を削除すると、以前と同じ速度で実行され(1秒未満)、その声明が含まれていた3行を引いたすべてのレコードを差し引いたものを返します。 ORステートメントの2番目の部分を削除すると、1秒以内に予想される3行を返します。
誰もが、なぜこれが起こっているのか、そしてこの変化が起こったときに正しい方向に私を向けてもらえますか?
よろしくお願いします
ジョナサン
Alexのソリューションを受け入れ、新しいバージョンのコードを含めました。新しいクエリOptimiserが遅くなるというクエリの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
所属していません StackOverflow