В настоящее время я обновляю сервер базы данных с SQL Server 2000 до SQL Server 2008 R2. Один из моих запросов использовался для запуска в течение секунды, и теперь он занимает более 3 минут (работает на более быстрой машине).Проблема SQL-запроса при обновлении с SQL Server 2000 до SQL Server 2008 R2
Я думаю, что я обнаружил, что это происходит неправильно, но не почему это происходит неправильно. Может ли кто-нибудь объяснить, в чем проблема, и как я могу ее решить?
Сокращенный код выглядит следующим образом:
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, она вернет 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
@marc_s: спасибо за редактирование –