Вопрос

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

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

Меня интересуют ответы администратора базы данных.

Редактировать:

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

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

против

select distinct a,b,c
from table x
Это было полезно?

Решение

Немного (ОЧЕНЬ мало) эмпирических данных из 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, безусловно, обрабатывает оба одинаково.

Другие советы

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

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

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

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

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

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

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

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

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

vs a "ОБЪЯСНИТЕ ВЫБОР a, b, c из T1, T2, где T2.A = T1.ГРУППА ПО a" просто показывает ", используя where"

Оба будут генерировать один и тот же план запроса в 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top