Чи проведе запит ДЕРЖАВИ перевірку простіших порівнянь (тобто біт) перед тим, як проводити більш важкі порівняння (тобто varchar)?


12

Якщо я запитую запит, що включає складене WHEREзастереження, наприклад:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

і включення цього bitпорівняння просто виключає ті самі поля, що і varcharпорівняння, чи наявність цього bitпорівняння поля призведе до покращення продуктивності?

Відповіді:


22

Важливо визнати, що SQL є декларативною мовою. У SELECTнаписаному вами запиті вказуються логічні результати, які слід повернути. Саме ефективна фізична стратегія для повернення цих результатів повинна визначати механізм бази даних, зокрема оптимізатор запитів.

Остаточний план фізичного виконання буде залежати від можливостей міркування оптимізатора, кількості часу, який він готовий витратити на вирішення проблеми, наявності відповідних методів доступу (насамперед індексів та матеріалізованих поглядів), репрезентативної статистичної інформації та конкретного шляху коду специфікація запиту бере код оптимізації.

Загалом, якщо дизайн вашої бази даних є реляційним, ви надаєте хороші методи доступу та точну статистичну інформацію, а запит добре написаний, оптимізатор зазвичай знайде розумну стратегію фізичного виконання, не потрібно занадто турбуватися про письмову форму надто специфікація запиту

Завжди знайдуться випадки, коли висловлення однієї і тієї ж логічної вимоги, використовуючи різні (але семантично ідентичні) синтаксиси, впливатиме на план фізичного виконання, але це має бути вторинним питанням. Знову ж таки, як правило, розглядати висловлення запиту можна по-іншому, якщо характеристики виконання неприйнятні, як тільки всі основні згадані основи будуть охоплені.

Вкрай рідко вкрай рідко, коли письмовий порядок простих сполучникових WHEREпредикатів (як у питанні) впливає на план фізичного виконання будь-яким вимірюваним способом. Коротше кажучи, це не те, про що варто витрачати час на занепокоєння. Спершу отримайте дизайн баз даних, індекси та статистичну інформацію.

Відповісти на питання безпосередньо (зрештою!), Додавання додаткової надлишкової умови може підвищити продуктивність, але лише якщо це дозволяє використовувати більш ефективний метод доступу - наприклад, якщо є лише індекс на (BitField, VarcharField). Якби вже був індекс на (VarcharField), він додав би лише накладні витрати.

Як деталь реалізації, ні, SQL Server не розглядає вартість порівнянь залежно від типу даних або очевидної складності обчислень. Насправді, скалярні операції взагалі недорого коштують , але це веде до цілої окремої теми.

Пов’язані запитання:

Логічні оператори АБО І в умові та порядку в WHERE
SQL Server 2008 та постійних виразах
Побітові оператори, що впливають на продуктивність Странна поведінка оператора
SQL


5

Бінарні розділи (як бітова колонка) звучать як хороші кандидати для відфільтрованих індексів.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Ясність ваших оптимізацій означає, що ваш код є надійнішим щодо змін інших людей, будь то у вашій кодовій базі чи на SQL Server.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.