SQL 'случай, когда' против 'где' эффективность - PullRequest
0 голосов
/ 20 июня 2019

Извините, я отредактировал запросы.

Извиняюсь, если об этом уже спрашивали, но я нигде не смог найти ответ.Что более эффективно:

Select SUM(case when col2=2 then col1 Else 0 End) From myTable 

ИЛИ

Select SUM(Col1) From myTable where col2=2

Или они одинаковой скорости?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Определенно второй должен быть быстрее. Это из-за концепции «Доступ» . Доступ относится к количеству данных, которые запрос должен получить для получения результата. Это оказывает большое влияние на «оператора», который оптимизатор ядра СУБД решает включить в план выполнения.

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

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

create index ix1 on myTable (col2);

В этом случае будет только доступ к подмножеству строк, соответствующих предикату фильтрации col2 = 2.

1 голос
/ 20 июня 2019

Второй более эффективен:

  • Обычно он обрабатывает меньшее количество строк (при условии, что значения не «2»), поскольку строки будут игнорироваться до агрегациивызывается функция.
  • Позволяет оптимизатору использовать преимущества индексов.
  • Позволяет оптимизатору использовать преимущества секций таблицы.

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

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