Проблема запросов SQL при модернизации от SQL Server 2000 до SQL Server 2008 R2
-
26-09-2019 - |
Вопрос
В настоящее время я обновляю сервер базы данных из SQL Server 2000 до SQL Server 2008 R2. Одним из моих запросов, использовавшихся под секунду, чтобы бежать, и теперь принимает превышение 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.transconingiD - это нулевой или" линия. Если я удалю это условие, он работает так быстро, как он используется для (менее секунды) и возвращает все записи, минус 3 строки, которые будут включены в этот оператор. Если я удалю вторую часть или оператор, он возвращает 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
Решение
Попробуйте реструктурируйте запрос, используя 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