Оптимизация SQL и дизъюнктивная нормальная форма - PullRequest
6 голосов
/ 25 июля 2011

Итак, я писал запрос в Visual Studio 2010 (я имею в виду, что открыл обозреватель сервера, щелкнул правой кнопкой мыши по серверу и выбрал Новый запрос). Запрос включает условие

A AND B AND C AND D AND E AND F AND (G OR H)

которая является конъюнктивной нормальной формой (CNF). Когда я запустил запрос (подключенный к MSSQL Server 2008), он изменил текст на

A AND B AND C AND D AND E AND F AND G OR
A AND B AND C AND D AND E AND F AND H

это дизъюнктивная нормальная форма (ДНФ).

Из того, что я нашел в Интернете, кажется, что DNF позволяет SQL запускать конъюнктивы отдельно и объединять их в конце.

Однако для чего-то подобного, с таким большим количеством повторяющихся условий, действительно ли DNF дает преимущество перед CNF? Если это не так, как я могу заставить оптимизатор принять условие как есть? Если да, должен ли я написать запрос в коде приложения в форме CNF, потому что он короче и аккуратнее, или в форме DNF, потому что это экономит время оптимизатора?

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Я не знаю об относительных преимуществах DNF / CNF в этой ситуации или даже о том, как заставить оптимизатор таким образом.

Вообще говоря, вы не хотите заставлять оптимизаторвозьмите свою «воспринимаемую», «текущую», оптимизацию по сравнению с той, которую она сгенерирует (есть исключения из этого, но они обычно редки).Это во многом связано с тем, что «лучшая» оптимизация может со временем меняться, как побочный эффект других действий (таких как добавление индекса).Если вы заставляете оптимизатор принять определенную оптимизацию, вы блокируете ее по этому пути, даже если новый может работать лучше.

Учитывая это, вы должны написать запрос в форме, котораяпроще всего читать и поддерживать (CNF), и позволить оптимизатору изменить его при необходимости - в этом весь смысл SQL, являющегося декларативным языком, позволяющим оптимизатору копаться в вещах по мере необходимости.

0 голосов
/ 25 июля 2011

От макушки головы мне интересно, что индексировать на G или H. Если бы индекс G был индексирован, но H не ... может быть, дизъюнктивный имеет смысл.

в любом случае, выВы можете запустить анализатор производительности самостоятельно, чтобы увидеть чистую разницу в производительности.

Кроме того, вот некоторые исследования, к которым вы могли бы получить доступ, если хотите погрузиться в них: Материал исследования: http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=842265&abstractAccess=no&userType=inst

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