1


0

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

現在、データベースサーバーを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 IS NULL OR" *行にあると思います。 この条件を削除すると、以前と同じ速度(1秒未満)で実行され、すべてのレコードから、そのステートメントに含まれる3行を引いたものが返されます。 ORステートメントの2番目の部分を削除すると、1秒未満で予想される3行が返されます。

なぜこれが起こっているのか、いつこの変化が起こったのかについて、誰かが正しい方向に私を指すことができますか?

事前に感謝します

ジョナサン

'' '' '

アレックスのソリューションを受け入れ、コードの新しいバージョンを含めました。 新しいクエリオプティマイザーの実行速度が遅いクエリの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

1 Answer


3


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