SQL группы по сравнению с различными - PullRequest
38 голосов
/ 09 января 2009

Зачем кому-то использовать группу по сравнению с отдельным, если в запросе нет агрегации?

Кроме того, кто-то знает группу по сравнению с различными соображениями производительности в MySQL и SQL Server. Я предполагаю, что в SQL Server есть лучший оптимизатор, и они могут быть там близки к аналогу, но в MySQL я ожидаю значительного улучшения производительности.

Меня интересуют ответы DBA.

EDIT:

Пост Билла интересен, но не применим. Позвольте мне быть более конкретным ...

select a, b, c 
from table x
group by a, b,c

против

select distinct a,b,c
from table x

Ответы [ 5 ]

29 голосов
/ 09 января 2009

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

SELECT b, c, d FROM table1 GROUP BY a;

Этот запрос является допустимым SQL ( исправление: только в MySQL; на самом деле это не стандартный SQL и не поддерживается другими брендами). MySQL принимает это и надеется, что вы знаете, что делаете, выбирая b, c и d однозначно, потому что они функциональные зависимости из a.

Однако Microsoft SQL Server и другие бренды не разрешают этот запрос, поскольку он не может легко определить функциональные зависимости. edit: Вместо этого стандартный SQL требует, чтобы вы следовали правилу Single-Value , т. Е. Каждый столбец в списке выбора должен быть назван в предложении GROUP BY или же быть аргумент для заданной функции.

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

SELECT DISTINCT(a), b, c FROM table1;

Несмотря на то, что круглые скобки DISTINCT выглядят как вызов функции, это не так. Это опция запроса, и различное значение в любом из трех полей списка выбора приведет к отдельной строке в результате запроса. У одного из выражений в этом списке выбора есть круглые скобки, но это не повлияет на результат.

18 голосов
/ 09 января 2009

Немного (ОЧЕНЬ мало) эмпирических данных из MS SQL Server, по паре случайных таблиц из нашей БД.

Для шаблона:

SELECT col1, col2 FROM table GROUP BY col1, col2

и

SELECT DISTINCT col1, col2 FROM table 

Если для запроса нет покрывающего индекса, оба способа создали следующий план запроса:

|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
   |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))

и когда был индекс покрытия, оба производили:

|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
   |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)

так что из этого очень маленького образца SQL Server, безусловно, обрабатывает оба одинаково.

3 голосов
/ 30 июня 2011

В MySQL я обнаружил, что использование GROUP BY часто лучше по производительности, чем DISTINCT.

Выполнение «EXPLAIN SELECT DISTINCT» показывает «Использование где; Использование временного» MySQL создаст временную таблицу.

против a "ОБЪЯСНИТЬ ВЫБОР a, b, c от T1, T2, где T2.A = T1.A GROUP BY a" просто показывает "Использование где"

2 голосов
/ 09 января 2009

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

Пожалуйста, посмотрите на эти сообщения:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html

0 голосов
/ 09 января 2009

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

...