2013-08-02 2 views
0

Почему запросы какTSQL Multiple В запросах плохой производительности

delete from A where F1 IN (1,2,3,5,5) and F2 IN (7,9,10,11) 

настолько медленно (F1 и F2 индексируются, статистика обновляется) и как вы оптимизировать их?

+1

Даже если F1 и F2 индексируются, считают, что наличие нескольких условий, как это эффективно малый sc эль-кросс-соединение. «Хорошо, у меня F1 = 1, есть F2 любой из .....». Таблица может быть проиндексирована, но ваши условия «IN» - нет. –

+0

Похож на небольшую, но болезненную проблему, когда оптимизатор sql не достаточно умен, чтобы справиться с этим. Я попробовал ANDs с декартовым продуктом моих двух входов, и он работал немного быстрее, в результате чего появился гигантский sql – user1514042

ответ

1

Учитывая ваш пример, я не уверен, что вы можете что-то сделать, чтобы повысить производительность.

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

Ваш лучший инструмент при рассмотрении производительности - изучить планы объяснения различных решений и посмотреть, какой из них наиболее подходит для количества и типов данных, которые вы ожидаете.

Этот SO пост объясняет некоторые о, как работает оператор IN ...

SQL Server IN vs. EXISTS Performance

Вот блог, который также обсуждает факторы производительности ...

http://sqlknowledgebank.blogspot.com/2012/11/in-exists-clause-and-their-performance.html

0

По догадка двойной контур

Мой выбор:
Это намного быстрее, чтобы оптимизировать отборный первый
С объединением на ПК оптимизатор запросов имеет больше работать с
Но с ПК вы не можете вставить 5 дважды

create table #tempF1 (ID int primary key); 
insert into #tempF1 values (1),(2),(3),(4); 
create table #tempF2 (ID int primary key); 
insert into #tempF2 values (1),(2),(3),(5); 

select * 
from tbl 
inner merge join #tempF1 
    on tbl.F1 = #tempF1.ID 
inner merge join #tempF2 
    on tbl.F1 = #tempF2.ID 

Может не работать в вашей ситуация и испытание другие присоединиться намеками и никакого намека на

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

Смежные вопросы