Странная проблема с левым соединением и подзапросом в Select - PullRequest
3 голосов
/ 15 сентября 2010

У меня есть запрос T-SQL, который вызывает проблемы с производительностью. Это коренастый, но часть, которая, кажется, вызывает проблему, является простым левым соединением.

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

Там не так много данных, и есть ключи / индексы во всех столбцах соединения. Единственное, что меня интересовало, - это статистика по базе данных и ее влияние на производительность.

Например ( N.b. Это просто упрощение гораздо более сложного запроса

SLOW

SELECT A.1,A.2,B.3 FROM A LEFT JOIN B ON A.ID = B.ID ...

БЫСТРО

SELECT A.1, A.2, (SELECT B.3 FROM B WHERE B.ID = A.ID) FROM A

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

Обычно подзапрос обычно медленнее, чем левое соединение, поэтому должно быть что-то еще.

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

Затем проверьте планы выполнения и посмотрите, в чем разница.И уверены ли вы, что в столбце идентификатора есть индекс?Ограничения FK не создают индексы автоматически.

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

0 голосов
/ 15 сентября 2010

эти два запроса могут быть не эквивалентны. Если ваш подзапрос:

(SELECT B.3 FROM B WHERE B.ID = A.ID)

возвращает более одной строки, ваше левое соединение просто вернет две строки, но ваш подзапрос взорвется с жалобой на то, что «подзапрос возвратил более одной строки» Если B.ID уникален, знает ли это оптимизатор? У вас есть уникальное ограничение или индекс?

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