Что оптимально? ОБЪЕДИНЕНИЕ, по сравнению с ГДЕ В (str1, str2, str3)

VBA очень ориентирован на EN-US. VBA .Formula и .FormulaR1C1 ожидают функцию ROW . Чтобы использовать «языковые функции» региональной языковой функции, такие как СТРОКА , вместо этого следует использовать свойство Range.FormulaLocal или Range.FormulaR1C1Local .

То же самое верно для символов разделителя списков. Используйте запятую (например, ,) для разделения аргументов в функции при использовании .Formula или .FormulaR1C1 независимо от региональных настроек системы. Если ваша система использует в качестве разделителя списка полуточку (например, ;), ее следует использовать только с .FormulaLocal или .FormulaR1C1Local.

Результат на листе будет правильно отражать языковые настройки установки Office.

myRange.Formula = "=ROW(mySheet!$12:$12)"
myRange.FormulaR1C1 = "=ROW(mySheet!R12)"
myRange.FormulaLocal  = "=СТРОКА(mySheet!$12:$12)"
myRange.FormulaR1C1Local= "=СТРОКА(mySheet!R12)"

6
задан Unheilig 21 December 2014 в 21:34
поделиться

7 ответов

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

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

Всегда используйте ОБЪЕДИНЕНИЕ ВСЕ, если Вы не знаете, почему Вы хотите использовать ОБЪЕДИНЕНИЕ.

Если Вы не уверены, что такое различие, посмотрите это ТАК вопрос.

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

3
ответ дан 10 December 2019 в 02:56
поделиться

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

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

2
ответ дан 10 December 2019 в 02:56
поделиться

Мое первое предположение было бы этим

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

У меня нет SQL Query Analyzer MS под рукой, чтобы на самом деле проверить мою гипотезу, но думать что, ГДЕ В варианте было бы быстрее, потому что с ОБЪЕДИНЕНИЕМ сервер должен будет сделать 3 сканирования таблицы, тогда как с тем, ГДЕ В будет нуждаться только в одном. Если у Вас есть планы выполнения проверки Query Analyzer относительно обоих запросов.

В Интернете можно часто встречаться с предложениями для избегания использования, ГДЕ В, но это относится к случаям где подзапросы используемый. Таким образом, этот случай вне объема этой рекомендации и дополнительно легче для чтения и понимания.

1
ответ дан 10 December 2019 в 02:56
поделиться

Я думаю, что существует несколько очень важной информации, отсутствующей в вопросе. В первую очередь, это - очень важная погода timezoneID, индексируется или нет, это часть первичного ключа и т.д. Я был бы совет все, чтобы взглянуть на анализатор, но по моему опыту оператор Where должен быть быстрее, особенно с индексом. Логика - что-то как, существуют дополнительные издержки в запросе на объединение, проверяя типы, номера столбцов в каждом и т.д.

1
ответ дан 10 December 2019 в 02:56
поделиться

В книге "Настройка производительности sql", авторы нашли, что Запросы на объединение были медленнее во всех 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, возможно, оптимизировал то различие далеко, но это сомнительно. Кроме того, метод ОБЪЕДИНЕНИЯ является намного длиннее и более трудным поддержать (что, если Вы хотите одну треть?) по сравнению с В.

Если у Вас нет серьезного основания использовать ОБЪЕДИНЕНИЕ, придерживаться с ИЛИ/В метод.

1
ответ дан 10 December 2019 в 02:56
поделиться

Оптимизаторы запросов некоторого DBMS изменяют Ваш запрос для создания этого более эффективным, таким образом, в зависимости от DBMS использование, Вы, вероятно, не должны заботиться.

0
ответ дан 10 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: