SQL Server: несколько запросов или UNION - PullRequest
3 голосов
/ 23 февраля 2011

У меня 16 запросов, которые мне нужно выполнить.Все эти запросы имеют один и тот же формат:

SELECT string, number, number 

Имеет смысл для меня сгруппировать все эти данные вместе, так как это создание панели мониторинга со всеми результатами.

Мой вопрос: выдумаете, UNION ALL будет быстрее, чем выполнять все запросы один за другим?

Ответы [ 5 ]

4 голосов
/ 23 февраля 2011

UNION ALL наверняка позволит вам быстрее вернуть данные.

Что вы собираетесь делать с данными на клиенте?Если вам придется разделить его обратно на 16 отдельных наборов данных, общее время выполнения, вероятно, увеличится.

Что бы вы ни делали, вам нужен только один вызов базы данных, поэтому, если вы оставите его как 16 отдельных запросов,было бы неплохо, чтобы все они вызывались в одной хранимой процедуре (или в подпроцедурных процедурах).

4 голосов
/ 23 февраля 2011

Union All быстрее, чем Union .

В случае Union , если у вас есть 10 столбцов и 100 строк, он будет сравнивать каждый cell.ie (10 * 100), чтобы получить различные значения в Union All , это не вариант. так что затраты на то, чтобы стать отличными, намного выше

3 голосов
/ 23 февраля 2011

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

1 голос
/ 23 февраля 2011

Выполнение их всех как одного запроса (UNION ALL'd вместе) будет включать в себя 1 поездку в обе стороны к базе данных, а не 16 поездок туда и обратно - поскольку каждая поездка из вашего кода .NET в SQL сопряжена с дополнительными издержками, то, очевидно, рационализация до 1 можетбыть выгодным с этой точки зрения.

Есть и другие перспективы, в зависимости от точного сценария, например- если все ваши запросы довольно мясистые, поддерживать их может быть немного сложнее (массивный запрос, объединяющий множество сложных операторов)- если отдельные запросы нужны сами по себе (то есть вы не всегда хотите возвращать их как часть одного набора результатов), то вы захотите разделить каждый запрос на его собственный sproc (не может UNRO sprocs)

Итак, то, как вы объедините эти результаты в одном вызове, изменится (например, подход с использованием временной таблицы, как уже предлагалось).Но в целом сведение к минимуму обращений к серверу базы данных может сократить время.Обратная сторона вопроса: есть ли другие области, которые можно настроить, чтобы повысить отдачу с точки зрения производительности?

1 голос
/ 23 февраля 2011

Если базовый запрос приводит к операции сканирования над объектом, эту операцию нужно будет выполнить только один раз для UNION, но она будет выполняться один раз для каждого запроса, если не для UNION - так что, да, вероятно, это будет быстрее.

Кроме того, с одним запросом будет значительно меньше коммуникационных издержек и болтовни,

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