2014-01-07 3 views
0

Я пытаюсь запустить запрос из нескольких таблиц, и у меня возникла проблема с тем, что запрос занимает более 10 минут, чтобы предоставить всего 3 записи. Запрос выглядит следующим образом:Несколько соединений в SQL-запросе

select TOP 100 pm_entity_type_name, year(event_date), 
     pm_event_type_name, pm_event_name, pm_entity_name, 
     pm_entity_code, event_priority, event_cost 

from pm_event_priority, pm_entity, pm_entity_type, pm_event_type, pm_event 

where pm_event.pm_event_id = pm_event_priority.pm_event_id 
    And pm_entity.pm_entity_id = pm_event_priority.pm_entity_id 
    And pm_entity_type.pm_entity_type_id = pm_entity.pm_entity_type_id 
    And pm_event_type.pm_event_type_id = pm_event_priority.pm_event_type_id 
    And (pm_entity.pm_entity_type_id = '002LEITUU0005T8EX40001XFTEW000000OZX' OR 
     pm_entity_type.parent_id= '002LEITUU0005T8EX40001XFTEW000000OZX') 
ORDER BY 1,2,3 

Интересно, есть ли способ, что я могу изменить этот запрос, возможно, сделать запрос немного быстрее?

+1

Какие индексы находятся на ваших таблицах? – David

ответ

0

Производительность запроса может быть заполнена, когда вам нужно объединить много больших таблиц вместе, особенно если столбцы соединения неправильно проиндексированы. В вашем случае я подозреваю, что ваши таблицы довольно большие (много строк), а столбцы _id не индексируются.

Если вы используете SQL Server Management Studio, вы можете нажать «Отобразить оценочный план выполнения», чтобы увидеть, как оптимизатор запросов интерпретирует ваш запрос. Если вы видите кучу сканирований таблиц, а не сканирование индексов/поиск, это означает, что SQL Server должен читать каждую строку в ваших таблицах; ночной кошмар! Попытайтесь поместить некоторые индексы в столбцы _id каждой таблицы (возможно, кластерный индекс) и/или с помощью советника по настройке ядра базы данных, чтобы автоматически рекомендовать лучшую структуру индекса для применения к вашим таблицам для повышения производительности этого запроса.

0

Вам нужно посмотреть план запроса. См. this question о том, как его получить.

Как только у вас есть план запроса, посмотрите, можете ли вы указать из списка, что так медленно. Скорее всего, есть сканирование таблиц из-за отсутствия индексов.

Что произойдет, если вы вытащите TOP 100 и выполните SELECT *, используя этот же критерий? Если вы получите нелепый объем данных, могут отсутствовать критерии подключения.

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