Производительность SQL - группировка по многим полям - PullRequest
2 голосов
/ 07 марта 2012

Мне было интересно, что лучше практиковать и / или быстрее.Ниже, customer_id является первичным ключом.Сгруппируйте по первичному ключу вместе с 5 другими полями или просто сгруппируйте по первичному ключу, а затем выполните объединение, чтобы получить другие поля.Или это вопрос «зависит»?

select customer_id, customer_name, customer_address, 5 other description fields.., 
  sum(amount) as SalesAmount
from customer c
inner join orders o
 on o.customer_id = c.customer_id
group by customer_id, customer_name, customer_address, 5 other description fields..

против

select customer_id, customer_name, customer_address, 5 other description fields..,
     SalesAmount
from 
(
   select customer_id,
   sum(amount) as SalesAmount
   from customer c
   inner join orders o
     on o.customer_id = c.customer_id
   group by customer_id
) t
inner join customer c
   on c.customer_id = t.customer_id

Ответы [ 4 ]

2 голосов
/ 07 марта 2012

Это зависимый вопрос. Последний вариант сделает еще одно соединение, которое потенциально медленнее. Но если дополнительные данные, которые вы получаете от этого объединения, велики, это может быть быстрее, потому что операция группировки не должна перемешивать все данные.

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

Я предполагаю, что для реальных данных и запросов первый вариант обычно намного быстрее.

1 голос
/ 07 марта 2012

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

Вы сами догадываетесь: это вопрос «все зависит», на который теоретически невозможно ответить. Вы должны сами это немного исследовать, исходя из своих реальных данных.

  1. Является ли производительность проблемой?
  2. Запустили ли вы свой код и проверили план выполнения запросов на наличие узких мест?
  3. Вы добавили какие-либо предлагаемые индексы?
0 голосов
/ 07 марта 2012

Производительность запросов к базе данных всегда зависит.

Используйте профилировщик или тестируйте альтернативы с реалистичным набором данных.

0 голосов
/ 07 марта 2012

Я думаю, что, как правило, эмпирическое правило состоит в том, чтобы по возможности избегать подзапросов, если не по каким-либо другим причинам, по стилистическим соображениям (и повысить шансы того, что оптимизатор запросов поймет, о чем вы говорите).
Однако есть только одинправильный ответ на вопросы производительности SQL: попробуйте сами на ваших данных.

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