Не удается понять, почему мой запрос занимает так много времени, ища советы по оптимизации.Запрос на выполнение плана выполнения SQL Server
update Laserbeak_Main.dbo.ACCOUNT_MPN set
DateUpgrade = ord.ConnectedDate
FROM [ORDER] ord
WHERE ord.AccountNumber = Laserbeak_Main.dbo.ACCOUNT_MPN.AccountNumber
AND ord.ordertypeID = '2'
AND ord.ConnectedDate IS NOT NULL
AND DateUpgrade <> ord.ConnectedDate
Execution plan as requested on brentozar.com
UPDATE: После предложений новый запрос выглядит следующим образом &, кажется, работает гораздо быстрее. Однако, если вы запустите запрос, он задает строки, как ожидалось, затем запустите снова, он обновит то же количество строк. Преобразование в select подтверждает, что одни и те же строки обновляются каждый раз. Предложение <> должно остановить это, но это не так. Я полагал, что это связано с сортировкой, но не удалось подтвердить, возможно ли иметь разные сопоставления на уровне таблицы в одной базе данных.
;WITH cteOrderInfo AS (
SELECT DISTINCT ord.AccountNumber, ord.ConnectedDate
FROM [ORDER] ord
WHERE ord.ordertypeID = '2'
AND ord.ConnectedDate IS NOT NULL
)
UPDATE Laserbeak_Main.dbo.ACCOUNT_MPN
SET Laserbeak_Main.dbo.ACCOUNT_MPN.DateUpgrade = cteOrderInfo.ConnectedDate
FROM cteOrderInfo
INNER JOIN Laserbeak_Main.dbo.ACCOUNT_MPN acc
ON cteOrderInfo.AccountNumber = acc.AccountNumber
WHERE cteOrderInfo.ConnectedDate <> acc.DateUpgrade
SELECT, чтобы подтвердить:
;WITH cteOrderInfo AS (
SELECT DISTINCT ord.AccountNumber, ord.ConnectedDate
FROM [ORDER] ord
WHERE ord.ordertypeID = '2'
AND ord.ConnectedDate IS NOT NULL
)
SELECT cteOrderInfo.ConnectedDate, acc.DateUpgrade
FROM cteOrderInfo
INNER JOIN Laserbeak_Main.dbo.ACCOUNT_MPN acc
ON cteOrderInfo.AccountNumber = acc.AccountNumber
WHERE cteOrderInfo.ConnectedDate <> acc.DateUpgrade
Выбирите Результаты Пример:
Не относится к оптимизации запросов, но ваш запрос может быть легче читать, если вы реструктурировать его немного: 'UPDATE согласно SET DateUpgrade = ord.ConnectedDate ОТ dbo.ACCOUNT_MPN согласно INNER JOIN dbo.ORDER Ord ON acc.AccountNumber = dbo.AccountNumber И ord.orderTypeID = 2' – Serge
Столбец 'AccountNumber' в таблице' ORDER' не уникален, не так ли? Если это так, если только предложение 'WHERE' не ограничивает набор данных, запрос будет обновлять каждую строку в таблице ACCOUNT_MPN' несколько раз. Чтобы избежать этого, вместо 'FROM ORDER' вы можете: a). используйте подзапрос с ключевым словом 'DISTINCT'; б). использовать подзапрос с предложением GROUP BY; или c). добавьте дополнительные условия в существующее предложение WHERE. – Serge
Можете вставить план выполнения здесь и поделиться ссылкой: https: //www.brentozar.com/pastetheplan/ – TheGameiswar