2010-10-11 5 views
8

У меня есть два запроса, которые я UNION вместе, чтобы я уже знал, что между двумя запросами не будет повторяющихся элементов. Поэтому UNION и UNION ALL приведут к тем же результатам.Чтобы объединить все, вот вопрос

Какой я должен использовать?

ответ

23

Вы должны использовать тот, который соответствует цели того, что вы ищете. Если вы хотите убедиться, что нет дубликатов, используйте UNION, в противном случае используйте UNION ALL. Просто потому, что ваши данные будут давать одинаковые результаты прямо сейчас не означает, что он всегда будет.

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

+1

Вам понравился бы сироп с этой вафельной линией? –

+0

Учитывая, что данные извлекаются из двух несвязанных таблиц, содержащих GUID, я знаю, что никогда не будет дублированного содержимого между двумя запросами. –

+3

@Mark - Это не вафель, он отвечает на два вопроса. Главный вопрос: «Какой я должен использовать?» и ответ «используйте тот, который соответствует вашим намерениям». * Подразумеваемый * вопрос: «Какой из них будет быстрее использовать?», И ответ есть «UNION ALL» –

1

Я хотел бы использовать UNION ALL в любом случае. Даже если вы знаете, что не будет дубликатов, в зависимости от вашего сервера сервера базы данных, возможно, он этого не знает.

Так, чтобы предоставить дополнительную информацию серверу БД, чтобы его планировщик запросов мог выбрать лучший вариант (возможно), используйте UNION ALL.

Сказав, что, если ваш сервер БД «s планировщик запросов умна достаточно, чтобы сделать вывод, что информация из UNION пунктов и таблицы индексов, то результаты (производительность и семантические мудры) должны быть одинаковыми.

В любом случае, это сильно зависит от сервера базы данных , который вы используете.

6

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

UNION ALL будет абсолютно превзойти UNION, поскольку SQL не нужно проверять два набора для дубликатов.

Если вам не нужен SQL для проверки дубликатов, всегда используйте UNION ALL.

+0

Думаю, он уже это знает. Он спрашивает конкретно о сценарии, который, как он знает (и, вероятно, БД тоже знает), не будет дураков. –

+1

Я не понимаю. Вы спрашиваете: «Если SQL может определить, что никогда не будет перекрытий в двух наборах, оптимизирует ли это« UNION », поэтому ему не нужно сравнивать, что делает его идентичным для UNION ALL? Ответ: Нет. используйте 'UNION ALL' – BradC

1

Поскольку дубликатов не будет использоваться, используйте UNION ALL. Вам не нужно проверять наличие дубликатов, а UNION ALL будет выполнять задачу более эффективно.