Что быстрее: сумма (случай, когда) или группировка по / количеству (*)? - PullRequest
1 голос
/ 21 октября 2011

Я могу написать

Select 
Sum(Case When Resposta.Tecla = 1 Then 1 Else 0 End) Valor1,
Sum(Case When Resposta.Tecla = 2 Then 1 Else 0 End) Valor2,
Sum(Case When Resposta.Tecla = 3 Then 1 Else 0 End) Valor3,
Sum(Case When Resposta.Tecla = 4 Then 1 Else 0 End) Valor4,
Sum(Case When Resposta.Tecla = 5 Then 1 Else 0 End) Valor5
From Resposta

Или

Select 
    Count(*)
From Resposta Group By Tecla

Я пробовал это на большом количестве строк, и кажется, что это заняло то же время.

Кто-нибудь может подтвердить это?

Ответы [ 5 ]

3 голосов
/ 21 октября 2011

То, что БД делает внутренне со вторым запросом, практически совпадает с тем, что вы явно указываете делать с первым запросом. Не должно быть никакой разницы в плане выполнения и, следовательно, во времени, которое занимает запрос. Принимая это во внимание, лучше использовать второй запрос:

  • это гораздо более гибко, когда больше значений Tecla вы не нужно менять ваш запрос
  • это легче понять. Если у вас много значений для Tecla будет сложнее прочесть первый запрос и понять, что он просто имеет значение различные значения
  • он меньше - вы отправляете меньше информации на сервер БД, и он, вероятно, будет анализировать запрос быстрее, что является единственным различием в производительности, которое я вижу в этих запросах. Это имеет значение, хотя и небольшое
3 голосов
/ 21 октября 2011

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

Вы можете попробовать команду «объяснить / объяснить план», чтобы увидеть, как механизм вычисляет ваши запросы, но с моим Microsoft SQL ServerВ 2008 году я просто вижу перестановку между 2 операциями («Вычислить скаляр» и «объединить»).

Я пытался выполнить такие запросы к таблице базы данных:

  • SQL Server 2k8
  • 163000 строк в таблице
  • 12 категорий (Valor1 -> Valor12)

результаты совершенно разные:

  • Группировка по: 2 секунды
  • Случай, когда: 6 секунд!

Так что мой выбор - «Группировать по».Еще одним преимуществом является то, что запрос проще написать!

2 голосов
/ 21 октября 2011

По моему мнению, оператор GROUP BY всегда будет быстрее, чем SUM(CASE WHEN ...), потому что в вашем примере для SUM ... будет 5 различных вычислений, в то время как при использовании GROUP BY БД будет просто сортировать и вычислять.1006 * Представьте, у вас есть сумка с разными монетами, и вам нужно знать, сколько у вас монет типа earch.Вы можете сделать это следующим образом:

  • Способ SUM(CASE WHEN ...) будет состоять в том, чтобы сравнивать каждую монету с предварительно определенными образцами монет и делать математические расчеты для каждого образца (добавьте 1 или 0);* Способ GROUP BY состоит в том, чтобы отсортировать монеты по их типам, а затем подсчитать группу earch.

Какой метод вы бы предпочли?

2 голосов
/ 21 октября 2011

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

Я бы обычно использовал:

Select
    Tecla,
    Count(*)
From Resposta
Group By Tecla

Если есть разумная вероятность того, что диапазон значений Tecla изменится в будущем.

0 голосов
/ 04 апреля 2013

Чтобы честно конкурировать с count(*), ваш первый SQL, вероятно, должен быть:

Select 
Sum(Case When Resposta.Tecla >= 1 AND Resposta.Tecla <=5 Then 1 Else 0 End) Valor
From Resposta

И чтобы ответить на ваш вопрос, я вообще не замечаю разницы в скорости между SUM CASE WHEN и COUNT.Я запрашиваю более 250 000 строк в POSTGRESQL.

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