Влияет ли порядок параметров в предложении where на то, использует ли таблица индекс? - PullRequest
4 голосов
/ 11 ноября 2008

Так что мне интересно, есть ли однозначный ответ на этот вопрос?
Кроме того, имеет ли значение, если индекс является кластеризованным или некластеризованным. Это одинаково во всех реализациях СУБД или точное поведение будет частным?

Ответы [ 5 ]

6 голосов
/ 11 ноября 2008

SQL является декларативным языком, а не процедурным. У каждой реализации SQL будут свои особенности, связанные с деталями реализации, например, какие индексы используются, как оптимизатор решает, какие индексы использовать, что может сделать программист SQL, чтобы повлиять на выбор, и т. Д.

1 голос
/ 11 ноября 2008

Когда-то (давно, т.е. примерно до 1995 г.) в Oracle раньше был только «оптимизатор на основе правил», и с этим, безусловно, был случай, когда порядок предикатов в предложении WHERE и порядок таблиц в предложении FROM (тогда синтаксиса JOIN не было) это повлияло на план запроса: это было задокументировано. Однако оптимизаторы, основанные на затратах (которые Oracle имеет с тех пор), пытаются изучить все возможные планы (или, по крайней мере, столько, сколько они могут в рамках некоторых разумных параметров) и выбрать наиболее эффективные.

1 голос
/ 11 ноября 2008

Порядок предложения where не должен влиять на план запроса или индексы, используемые в любой респектабельной базе данных, хотя я видел по крайней мере одну (неуважительную) базу данных, где это не так.

1 голос
/ 11 ноября 2008

Использование индексов - это не часть стандарта SQL, а скорее деталь реализации конкретной СУБД.

В идеале, это не должно влиять на это, поскольку оно не влияет на фактические возвращаемые строки.

Но я видел запросы к неназванной СУБД, которая меняет использование индекса в зависимости от порядка запросов SQL.

0 голосов
/ 22 мая 2010

Сложно ответить, потому что я думаю, что никто не знает, включая инженеров СУБД! LOL, это сарказм, но на самом деле я имею в виду, что он по своей сути недетерминирован. Я могу ошибаться, но это действительно сводится к реализации механизма БД, поскольку, насколько мне известно, стандарт ANSI SQL или любой другой стандарт не регулируют это понятие семантики индекса. Однако я знаю, что ПЕРВАЯ ссылка на любое проиндексированное поле имеет значение, так как она отмечает вершину дерева решений для механизма запросов. Отсюда и в зависимости от количества и типа индексов механизм запросов может выбрать использование первого и наиболее подходящего индекса, который он найдет, или он может решить «оптимизировать» и вместо этого использовать другой индекс. Я думаю, это та часть, которая делает его недетерминированным.

...