Сведения о вопросе

Faridun

01:57, 4th August, 2020

Теги

sql   optimization    

Что является оптимальным? UNION ВС, где в (str1 выглядит следующим образом, стр2, стр3)

Просмотров: 447   Ответов: 7

Я пишу программу, которая отправляет email в определенное локальное время клиента. У меня есть.NET метод, который принимает timezone & времени и назначения timezone и возвращает время в этом timezone. Поэтому мой метод состоит в том, чтобы выбрать каждый отдельный timezone в базе данных, проверить, правильно ли это время с помощью метода, а затем выбрать каждого клиента из базы данных с этим timezone(s).

Запрос будет выглядеть как один из них. Имейте в виду, что порядок результирующего набора не имеет значения, поэтому объединение было бы хорошо. Что работает быстрее, или они действительно делают то же самое?

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)

или

SELECT email FROM tClient WHERE timezoneID = 1
    UNION ALL SELECT email FROM tClient WHERE timezoneID = 4
    UNION ALL SELECT email FROM tCLIENT WHERE timezoneID = 9

Изменить: timezoneID-это внешний ключ к tTimezone, таблица с первичным ключом timezoneID и полем varchar (20) timezoneName.



  Сведения об ответе

park

22:27, 10th August, 2020

Эй! Эти запросы не являются эквивалентными.

Результаты будут такими же, только если предположить, что один email принадлежит только одному часовому поясу. Конечно, это так, однако движок SQL этого не знает и пытается устранить дубликаты. Так что первый запрос должен быть быстрее.

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

Если вы не уверены, в чем разница, смотрите этот вопрос SO.

Примечание: этот вопль относится к предыдущей версии вопроса.


  Сведения об ответе

SILA

21:56, 14th August, 2020

Для большинства вопросов производительности, связанных с базой данных, реальный ответ заключается в том, чтобы запустить его и проанализировать, что DB делает для вашего набора данных. Запустите план объяснения или trace, чтобы увидеть, попадает ли ваш запрос в правильные индексы, или создайте индексы, если это необходимо.

Я бы, скорее всего, пошел с первым, используя предложение IN, поскольку оно несет в себе большую семантику того, что вы хотите. timezoneID выглядит как первичный ключ в какой-то таблице timezone, поэтому он должен быть внешним ключом в email и индексироваться. В зависимости от оптимизатора DB, я думаю, что он должен выполнить сканирование индекса по индексу внешнего ключа.


  Сведения об ответе

padenie

11:12, 4th August, 2020

Мое первое предположение было бы таково

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
это будет быстрее, так как требуется только одно сканирование таблицы, чтобы найти результаты, но я предлагаю проверить план выполнения для обоих запросов.


  Сведения об ответе

darknet

01:07, 24th August, 2020

У меня нет MS SQL Query Analyzer под рукой, чтобы фактически проверить мою гипотезу, но думаю, что где в варианте будет быстрее, потому что с UNION сервером придется делать 3 сканирования таблиц, тогда как с WHERE IN понадобится только один. Если у вас есть анализатор запросов, проверьте планы выполнения для обоих запросов.

В интернете вы можете часто сталкиваться с предложениями избегать использования WHERE IN, но это относится к случаям, когда используются подзапросы a. Таким образом, этот случай выходит за рамки данной рекомендации и, кроме того, легче для чтения и понимания.


  Сведения об ответе

PROGA

18:05, 27th August, 2020

Я думаю, что в этом вопросе отсутствует несколько очень важных сведений. Прежде всего, очень важно, индексируется ли timezoneID или нет, является ли он частью первичного ключа и т.д. Я бы посоветовал всем посмотреть на анализатор, но по моему опыту предложение WHERE должно быть быстрее, особенно с индексом. Логика примерно такая:есть дополнительные накладные расходы в объединении запросов, проверка типов, номера столбцов в каждом и т.д.


  Сведения об ответе

dump

01:18, 24th August, 2020

В книге "настройка производительности SQL" авторы обнаружили, что запросы UNION были медленнее во всех 7 DBMS', которые они тестировали (SQL Server 2000, Sybase ASE 12.5, Oracle 9i, DB2 и т. д.): http://books.google.com/books?id=3H9CC54qYeEC&pg=PA32&vq=UNION&dq=sql+performance+tuning&source=gbs_search_s&sig=ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA#PPA33,M1

Более поздний DBMS', возможно, оптимизировал эту разницу, но это сомнительно. Кроме того, метод UNION намного длиннее и сложнее в обслуживании (что делать, если вы хотите третий?) против IN.

Если у вас нет веских причин использовать UNION, придерживайтесь метода OR/IN.


  Сведения об ответе

JUST___

08:51, 16th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться