sql группировать по сравнению с distinct
-
06-07-2019 - |
Вопрос
Зачем кому-то использовать 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://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html
Если вы действительно ищете различные значения, то distinct делает исходный код более читаемым (например, если он является частью хранимой процедуры). Если я пишу специальные запросы, я обычно начинаю с group by , даже если у меня нет агрегатов, потому что в конечном итоге я часто их включаю.