SQL Server 2000からSQL Server 2008 R2にアップグレードするときのSQLクエリの問題

StackOverflow https://stackoverflow.com/questions/4034122

質問

現在、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top