Я выполняю пакет операторов и 100% относительного времени, используемого в этом запросе:
select c.*,q.dbupddate
into #c
from
customer c
cross apply
(
select top 1 code,transferred,dbupddate
from transfer_customer_connect_log l
where l.code=c.code
order by dbupddate desc
)q
where q.transferred=0
с этим планом: https://www.brentozar.com/pastetheplan/?id=Syq811nJm
Этот запрос предназначенперенести строки из одной базы данных (app_connect) в другую (app).В таблице Transfer_customer_connect_log записи с переданным = 1 уже обработаны и должны игнорироваться.Кроме того, из оставшихся строк с перенесенным = 0 некоторые (клиентские) коды могут существовать несколько раз в таблице с разными (dbupd) датами, и в этом случае я должен рассмотреть только самые последние.
Я виделот плана, что sort by dbupddate
, чтобы сделать верхнюю 1 часть, занимает 97% времени.Итак, я добавил кластерный индекс pk (dbupddate, code).Интересно, что ничего не изменилось!Разве индекс не сделает сортировку ненужной?
Один из альтернативных подходов состоит в том, чтобы вместо того, чтобы каждый раз делать первую первую проверку каждый раз, «сохранять» свои результаты при каждой вставке строки, отмечая «старые» строки(перенесено = 0, но не в топ-1 последних) с флагом, а затем использовать этот флаг в where
, чтобы исключить его из будущих соображений.
Является ли такой образ мышления твердым?Что еще я мог бы сделать, чтобы улучшить это, основываясь на функциональности, которую я описал?