ahmed_sa Ответов: 2

Как написать этот запрос для хорошей производительности ?


how to write this query for good performance ?

I have query when i run it take may be 5 minutes to run

so i need to rewrite with good syntax for good performance

but i dont know how to enhance that query


Что я уже пробовал:

select p.partid,p.maskedid,m.chemicalid into #temp2 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  
update t1 set t1.status='conflict data' from #temp t1 inner join #temp2 t2 on  t1.maskid=t2.maskedid   
 so how to enhancement this query please ?

2 Ответов

Рейтинг:
4

Prem Vaghasiya

UPDATE t1 SET t1.status='conflict data'
FROM #temp t1 
LEFT OUTER join (select p.maskedid  
					FROM #temp t 
					LEFT OUTER JOIN parts p on  p.maskedid=t.maskId
					LEFT OUTER JOIN chemicalmaster m on m.partid=p.partid    
					WHERE p.maskedid IS NOT NULL AND m.partid IS NOT NULL 
					AND p.partid != t.partId
					AND m.chemicalid != t.chemicalId) t2 on  t1.maskid=t2.maskedid 
					
WHERE t2.maskedid IS NOT NULL


Maciej Los

Не по теме!

Рейтинг:
1

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

Это могло бы помочь двигателю выполнить работу за один прогон

Но я считаю, что самая большая выгода будет получена, если вы сможете полностью избавиться от временных таблиц. Однако для этого необходимо проанализировать всю логику партии.


Maciej Los

5ed!

Wendelius

Спасибо!