Используйте UNION и UNION ALL в одном запросе

У меня возникла проблема с производительностью, и у меня есть следующий запрос:

SELECT * FROM Foo

UNION

SELECT * FROM Boo

UNION

SELECT * FROM Koo

Я точно знаю, что Koo не возвращает дубликатов. Я собирался использовать UNION ALL в конце и, следовательно, сэкономить время сортировки и отдельного выбора для Koo. Запрос должен выглядеть так:

SELECT * FROM Foo

UNION

SELECT * FROM Boo

UNION ALL

SELECT * FROM Koo

Поможет ли это или это повлияет на первую UNION?


person Moslem Ben Dhaou    schedule 11.12.2012    source источник
comment
Протестируйте оба подхода — просмотрите планы запросов и посмотрите, есть ли какая-либо разница.   -  person Oded    schedule 11.12.2012
comment
@Oded да, но только если ваши тестовые данные и конфигурация вашего сервера являются репрезентативными. В противном случае вы можете сделать ложные предположения, основанные на (не)оптимизациях, связанных с вашей тестовой настройкой. т. е. изучение планов запросов на ваших 10 записях, одном ядре, настройке с низким объемом ОЗУ не очень полезно, если вы намереваетесь иметь 10 000 000 записей, 32 ядра и много ОЗУ.   -  person Jodrell    schedule 11.12.2012
comment
Обратите внимание, что не только в Koo не должно быть дубликатов, но и в том, что Koo не должен содержать строк из Foo или Boo.   -  person Lord Peter    schedule 11.12.2012


Ответы (1)


Всегда используйте UNION ALL, если вы знаете, что дубликатов не будет.

Здесь немного серовато, но все же стоит - хотя практически маргинально.

Если это просто ОБЪЕДИНЕНИЕ-ОБЪЕДИНЕНИЕ, SQL Server может оптимизировать его, чтобы сопоставить все 3 набора результатов и выполнить одну сортировку для обоих. Поскольку сортировка в основном O (n log n), это составляет очень небольшую разницу между этим и [(отличное B) добавить C].

обновить

Хотя можно выполнить одну сортировку слиянием, SQL Server, похоже, не делает этого (по крайней мере, не всегда), поэтому мудрость использования UNION ALL определенно стоит того. Сравните планы здесь: SQLFiddle (нажмите "Просмотреть план выполнения " ссылки)

person RichardTheKiwi    schedule 11.12.2012
comment
Если Koo - большая таблица, я бы сказал, что есть большая разница в использовании UNION ALL для объединения Koo... Так что я не уверен, что это действительно незначительно. - person Lukas Eder; 11.12.2012
comment
Если вы знаете что-то полезное о данных, имеет смысл сообщить об этом обработчику запросов. Вероятно, это поможет при составлении плана запроса. - person Jodrell; 11.12.2012
comment
@Lukas Если SQL Server оптимизировал две сортировки в одну операцию, тогда она становится concat-concat-sort vs concat-sort-concat, где характер сортировки O (n log n) делает разницу менее заметной. Поскольку SQL Server не [всегда?] оптимизирует его, то он определенно намного быстрее, чем concat-sort-concat-sort. - person RichardTheKiwi; 11.12.2012