Wendelius
Производительность оператора SQL-это комбинация нескольких факторов. Ключевые вещи включают в себя:
- Логика высказывания
- Количество данных в каждой таблице
- Избирательность операций
- Индексирование
Способ написания одного оператора часто играет второстепенную роль, поскольку задача оптимизатора состоит в анализе вариаций различных планов выполнения на основе различных синтаксических изменений.
Для правильной работы запроса проще всего сосредоточиться на индексации. Хорошие индексы обеспечивают надлежащую производительность. Однако их создание и поддержание приводит к накладным расходам.
Вы, кажется, используете много временных таблиц. Если эти таблицы используются только в этом сценарии, индексирование их не обязательно помогает, поскольку создание индекса может быть медленным. С другой стороны, если эти таблицы постоянно используются без их повторного создания, то индексация может помочь.
Если вы решите создать индексы, то первыми кандидатами могут быть
- части.маскид
- #"темп".maskid
- chemicalmaster.partid не
- chemicalmaster.chemicalid
Однако у меня есть сомнения по этому поводу, так как вы используете много операторов неравенства...
Еще одна вещь может заключаться в том, чтобы объединить выбор и обновление. Что-то вроде
update t1 set t1.status='conflict data'
from #temp t1
inner join (select p.partid,p.maskedid,m.chemicalid
from #temp t
inner join parts p on p.maskedid=t.maskId
and p.partid<>t.partId
inner join chemicalmaster m on m.partid=p.partid
and m.chemicalid<>t.chemicalId) t2 on t1.maskid = t2.maskedid
Это могло бы помочь двигателю выполнить работу за один прогон
Но я считаю, что самая большая выгода будет получена, если вы сможете полностью избавиться от временных таблиц. Однако для этого необходимо проанализировать всю логику партии.