Более эффективное левое соединение большого стола - PullRequest
3 голосов
/ 04 мая 2010

У меня следующий (упрощенный) запрос

select P.peopleID, P.peopleName, ED.DataNumber
from peopleTable P
    left outer join (   
        select PE.peopleID, PE.DataNumber 
        from formElements FE
             inner join peopleExtra PE on PE.ElementID = FE.FormElementID 
        where FE.FormComponentID = 42
    ) ED on ED.peopleID = P.peopleID

Без подзапроса эта процедура занимает ~ 7 секунд, но с ним она занимает около 3 минут.

Учитывая, что таблица peopleExtra довольно большая, есть ли более эффективный способ сделать это объединение (если не считать реструктуризацию БД)?

Подробнее:

Внутренняя часть подзапроса, например,

  select PE.peopleID, PE.DataNumber 
        from formElements FE
             inner join peopleExtra PE on PE.ElementID = FE.FormElementID 
        where FE.FormComponentID = 42

Требуется от <1 до 5 секунд для выполнения и возвращает 95k строк </p>

В таблице people 1500 записей.

Ответы [ 3 ]

2 голосов
/ 04 мая 2010

Ваш запрос в порядке, просто создайте следующие индексы:

PeopleExtra (PeopleID) INCLUDE (DataNumber, ElementID)
FormElements (FormComponentID, FormElementID)

Перезапись объединения не требуется (оптимизатор SQL Server может прекрасно справляться с вложенными запросами), хотя это может сделать ваш запрос более читабельным.

1 голос
/ 04 мая 2010

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

select p.peopleID, p.peopleName, pe.DataNumber
from peopleTable p
left join (
  formElements fe
  inner join peopleExtra pe on pe.ElementID = fe.FormElementID
) on pe.peopleID = p.peopleID
where fe.FormComponentID = 42
1 голос
/ 04 мая 2010

сколько времени занимает этот подзапрос? Если это занимает около 3 минут, то вам нужно сделать подзапрос более эффективным сам по себе - если это займет всего несколько секунд, то над всем этим оператором нужно работать.

Есть ли какие-нибудь индексы на peopleExtra? В частности, что начинается с ElementID и включает в себя DataNumber? Я подозреваю, что проблема в соединении внутри вашего подзапроса, которое вызывает проблемы.

Кроме того, не могли бы вы включить план запроса? Выполните SET SHOWPLAN_TEXT ON перед вашим запросом, а затем опубликуйте результаты здесь - это поможет определить, что замедляет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...