Вопрос оптимизации запросов к базе данных - PullRequest
1 голос
/ 02 ноября 2010

Допущения для вопроса:

  1. База данных Agnostic
  2. Оба запроса вернут только одну строку из-за значений X и Y

Вопрос:

Какой запрос выполняется быстрее и является ли лучше??:

SELECT * FROM my_table WHERE X = 'some value' AND Y = 'other value';

Или

SELECT * FROM my_table WHERE X = 'some value';

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

Ответы [ 5 ]

4 голосов
/ 02 ноября 2010

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

Лучше всего написать запрос таким образом, чтобы решить вашу бизнес-проблему и позволить чипам упасть, где они могут. Если вы, очевидно, знаете, что параметр является избыточным, оставьте его, если только по какой-то другой причине, кроме как для упрощения вашего кода. Однако я бы не стал тратить много времени на поиск ситуаций, когда параметр избыточен из-за текущего состояния данных.

1 голос
/ 02 ноября 2010

Относительно производительности не должно быть существенной разницы, если ваши таблицы проиндексированы правильно.

  • Если столбец X имеет индекс, оба запроса будут быстрыми.X и Y индексируются, оба запроса не будут такими быстрыми, но схожими по скорости (при условии, что для большинства строк оба условия не выполняются - будет выполняться только одно).
  • Если столбец Y проиндексирован, но не Xтогда второй запрос будет быстрее, поскольку он единственный, который может использовать индекс для столбца Y.

Следует помнить, что два запроса могут давать разные результаты, если значенияX и Y не то, что вы ожидали.В первом случае он вернет строку, даже если значение Y отличается от ожидаемого.Во втором случае строка не будет возвращена вообще.Вы должны рассмотреть, что вы хотите, чтобы произошло в этой ситуации ошибки и выбрать запрос на основе этого решения.Если вы хотите отобразить ошибку Expected value 'foo' for Y but found 'bar', вам нужно выбрать строку, чтобы первый запрос был более подходящим.

0 голосов
/ 04 ноября 2010

Логически, если и запрос с одним параметром, и запрос с двумя параметрами выбирают одну строку, а X является их общим условием, AND Y = 'другое значение' не должно быть значимым столбцом в оптимизаторе запросов.

Если вам не нужен и нужен только Y в качестве условия запроса для одной строки, индекс по Y в этом примере не является хорошей практикой.

Индекс по X является существенным моментом в этом примере, посколькузапрос с одним параметром должен возвращать «одну строку».

Я думаю, что проблема производительности базы данных заключается в том, что вам нужно и как вы выбираете нужную строку при более низком вводе / выводе (логический ввод / вывод с неявным физическим вводом / выводом)O).

И наилучшая практика, однако, я также согласен с решением вашей бизнес-проблемы .

0 голосов
/ 02 ноября 2010

Если у вас есть индекс для (X, Y), не должно быть разницы в скорости, если оба запроса действительно возвращают одинаковое количество строк (если второй запрос возвращает больше строк, то, конечно, это будет медленнее)

Если ваш индекс наоборот, то есть определен как (Y, X), второй запрос может быть значительно медленнее, так как этот индекс не может использоваться для большинства СУБД.

Я думаю, что Oracle 11g сможет использовать индекс (Y, X) даже для второго запроса, но он все равно будет медленнее в качестве совпадения префикса для индекса.

0 голосов
/ 02 ноября 2010

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

...