Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Что является оптимальным? UNION ВС, где в (str1 выглядит следующим образом, стр2, стр3)
Я пишу программу, которая отправляет 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.
Эй! Эти запросы не являются эквивалентными.
Результаты будут такими же, только если предположить, что один email принадлежит только одному часовому поясу. Конечно, это так, однако движок SQL этого не знает и пытается устранить дубликаты. Так что первый запрос должен быть быстрее.
Всегда используйте UNION ALL, если вы не знаете, почему вы хотите использовать UNION.
Если вы не уверены, в чем разница, смотрите этот вопрос SO.
Примечание: этот вопль относится к предыдущей версии вопроса.
Для большинства вопросов производительности, связанных с базой данных, реальный ответ заключается в том, чтобы запустить его и проанализировать, что DB делает для вашего набора данных. Запустите план объяснения или trace, чтобы увидеть, попадает ли ваш запрос в правильные индексы, или создайте индексы, если это необходимо.
Я бы, скорее всего, пошел с первым, используя предложение IN, поскольку оно несет в себе большую семантику того, что вы хотите. timezoneID выглядит как первичный ключ в какой-то таблице timezone, поэтому он должен быть внешним ключом в email и индексироваться. В зависимости от оптимизатора DB, я думаю, что он должен выполнить сканирование индекса по индексу внешнего ключа.
У меня нет MS SQL Query Analyzer под рукой, чтобы фактически проверить мою гипотезу, но думаю, что где в варианте будет быстрее, потому что с UNION сервером придется делать 3 сканирования таблиц, тогда как с WHERE IN понадобится только один. Если у вас есть анализатор запросов, проверьте планы выполнения для обоих запросов.
В интернете вы можете часто сталкиваться с предложениями избегать использования WHERE IN, но это относится к случаям, когда используются подзапросы a. Таким образом, этот случай выходит за рамки данной рекомендации и, кроме того, легче для чтения и понимания.
Я думаю, что в этом вопросе отсутствует несколько очень важных сведений. Прежде всего, очень важно, индексируется ли timezoneID или нет, является ли он частью первичного ключа и т.д. Я бы посоветовал всем посмотреть на анализатор, но по моему опыту предложение WHERE должно быть быстрее, особенно с индексом. Логика примерно такая:есть дополнительные накладные расходы в объединении запросов, проверка типов, номера столбцов в каждом и т.д.
В книге "настройка производительности 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.