Подтвердить что ты не робот

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
4b9b3361

Ответ 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-запросы, я обычно начинаю с группы, даже если у меня нет скоплений, потому что я часто введу их.