«Sub SELECT до INNER JOIN» или «ГДЕ после INNER JOIN»? - PullRequest
4 голосов
/ 05 июля 2011

Есть таблица A и таблица B. Я хочу объединить эти таблицы в два столбца, но только для выбранных строк таблицы A.

Сценарии запроса:

SELECT B.*
FROM B
INNER JOIN (SELECT * FROM A WHERE A.COLUMN1 BETWEEN somevalue1 AND somevalue2) C
ON B.COLUMN2 = C.COLUMN2
AND B.COLUMN3 = C.COLUMN3

OR

SELECT B.*
FROM B
INNER JOIN A
ON B.COLUMN2 = A.COLUMN2
AND B.COLUMN3 = A.COLUMN3
WHERE A.COLUMN1 BETWEEN somevalue1 AND somevalue2

Обе таблицы A и B содержат миллионы записей. С таблицей условий WHERE A вернет мне только 1000 результатов, поэтому фактическое соединение, которое нужно выполнить, - найти подходящие детали из B только для 1000 строк A.

Запрос:

Какой из них должен быть быстрее? ( У меня нет доступа для просмотра плана выполнения запроса )

Спасибо!

1 Ответ

3 голосов
/ 05 июля 2011

Трудно предсказать производительность без фактического измерения.

Мои инстинкты говорят, что последний вариант должен быть быстрее, потому что оптимизатор может захотеть полностью материализовать внутренний запрос перед объединением, что, в дополнение к самому медленному , может нарушить любое индексирование, котороеможет помочь объединиться.С другой стороны, оптимизатор для последней опции должен быть достаточно умным, чтобы предварительно отфильтровать таблицу A перед объединением, без риска нарушения индексов и возможности только материализовать результаты, соответствующие объединению.Заметьте все слова ласки там, хотя;мои инстинкты могут быть далеко в этом случае.Реальный урок, который можно извлечь из этого, состоит в том, чтобы измерить ваш запрос, используя реальные данные в условиях, максимально приближенных к фактическим.

Что еще более важно, я предпочитаю последнее, потому что (имо) это простоболее читабельный и понятный.

...