Sql по сравнению с отдельными
Почему кто-то использует группу по сравнению с отдельными, если в запросе нет агрегатов?
Кроме того, кто-то знает группу по сравнению с различными соображениями производительности в 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
Ответы
Ответ 1
Немного (ОЧЕНЬ мало) эмпирических данных из 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, безусловно, относится к обоим.
Ответ 2
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 Rule, т.е. каждый столбец в списке выбора должен либоменоваться в предложении GROUP BY
, либо быть аргументом для заданной функции.
В то время как DISTINCT
всегда просматривает все столбцы в списке выбора и только те столбцы. Это распространенное заблуждение, что DISTINCT
позволяет вам указывать столбцы:
SELECT DISTINCT(a), b, c FROM table1;
Несмотря на круглые скобки, которые делают DISTINCT
похожим на вызов функции, это не так. Это опция запроса и отдельное значение в любом из трех полей списка выбора приведет к отдельной строке результата запроса. Одно из выражений в этом списке выбора имеет круглые скобки вокруг него, но это не повлияет на результат.
Ответ 3
В MySQL, который я нашел, используя GROUP BY, часто лучше, чем DISTINCT.
Выполнение "EXPLAIN SELECT DISTINCT" показывает "Использование где: с помощью временного" MySQL создаст временную таблицу.
vs a "EXPLAIN SELECT a, b, c из T1, T2, где T2.A = T1.A GROUP BY" just shows "Использование where"
Ответ 4
Оба будут генерировать тот же план запроса в 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
Ответ 5
Если вы действительно ищете разные значения, отдельный делает исходный код более удобочитаемым (например, если он является частью хранимой процедуры). Если я пишу ad-hoc-запросы, я обычно начинаю с группы, даже если у меня нет скоплений, потому что я часто введу их.