в чем разница между операторами distinct и group by
Что быстрее, выберите DISTINCT или GROUP BY в MySQL?
если у меня есть таблица
и я хочу получить все уникальные значения profession поле, что было бы быстрее (или рекомендуется):
15 ответов
они по существу эквивалентны друг другу (на самом деле это как некоторые базы данных реализации DISTINCT под капотом).
когда в сомнении, тест!
если у вас есть индекс на profession эти два слова-синонимы.
GROUP BY на MySQL результаты разные. Вы даже можете сделать:
и получить ваши профессии отсортированы в DESC порядок.
DISTINCT создает временную таблицу и использует его для хранения дубликатов. GROUP BY делает то же самое, но сортирует различные результаты впоследствии.
все ответы выше верны, для случая DISTINCT на одном столбце vs GROUP BY на одном столбце. Каждый движок БД имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень маленькой разнице (в большинстве случаев), то вам нужно протестировать против конкретного сервера и конкретной версии! Как реализации могут измениться.
но, если вы выбираете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае это будет сравнить все столбцы всех строк, а не только один столбец.
Так что если у вас есть что-то вроде:
Это распространенная ошибка думать, что ключевое слово DISTINCT различает строки по первому столбцу, который вы указали, но DISTINCT является общим ключевым словом таким образом.
таким образом, люди, Вы должны быть осторожны, чтобы не принимать ответы выше как правильные для всех случаев. Вы можете запутаться и получить неправильные результаты, в то время как все, что вы хотели, было оптимизация!
well distinct может быть медленнее, чем group by в некоторых случаях в postgres (не знаю о других dbs).
равна
похоже, что запросы не совсем одинаковы. По крайней мере для MySQL.
второй запрос дает дополнительно «использование filesort» в Extra.
(более функциональное Примечание)
есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на работодателя:
в таком случае DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто не знаю его. (Если кто-то знает, как сделать такой запрос с DISTINCT, пожалуйста, добавьте Примечание!)
Если вам не нужно выполнять какие-либо групповые функции (sum, average и т. д., Если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее, но у меня нет ничего, чтобы показать это.
в любом случае, если вы беспокоитесь о скорости, создать индекс по столбцу.
после тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее
выберите sql_no_cache opnamegroep_intern От telwerken Где opnemergroep IN (7,8,9,10,11,12,13) группа по opnamegroep_intern
635 totaal 0.0944 сек Weergave van records 0-29 (635 totaal, query duurde 0.0484 sec)
выберите sql_no_cache distinct (opnamegroep_intern) От telwerken Где opnemergroep IN (7,8,9,10,11,12,13)
635 totaal 0.2117 секунд ( почти 100% медленнее ) Weergave van records 0-29 (635 totaal, query duurde 0.3468 sec)
в моем проекте когда-то я использую group by и другие distinct
вот простой подход, который будет печатать 2 разных времени для каждого запроса.
Он просто отображает количество миллисекунд, необходимых для анализа, компиляции и выполнения каждого оператора, как показано ниже:
SELECT DISTINCT всегда будет одинаковым или быстрее, чем GROUP BY. В некоторых системах (например, Oracle) он может быть оптимизирован так же, как и для большинства запросов. На других (например, SQL Server) это может быть значительно быстрее.
Если проблема позволяет это, попробуйте с EXISTS, так как она оптимизирована для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, как это
более быстрый ответ был бы:
это не всегда возможно, но при наличии вы увидите более быстрый ответ.
В чем разница между операторами distinct и group by
1 Moscow001 aaa
2 Moscow001 aab
3 London002 aac
4 London002 aad
5 Moscow001 aaa
6 Moscow001 aab
7 London002 aaa
select names,numbers from test
group by names,numbers
aaa London002
aaa Moscow001
aab Moscow001
aac London002
aad London002
select distinct(names),numbers from test
aaa London002
aaa Moscow001
aab Moscow001
aac London002
aad London002
Re: group by vs distinct [new] | |
gjkmpjdfntkm Member �������� �� 2 ���������� ����������. | |
3 ��� 09, 22:53����[7492818] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | |
Naf Member ������: ������ | ���, �������� ���� ���������� �������. ���� � ���������, Naf |
4 ��� 09, 08:29����[7493422] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | |
MasterZiv Member ������: ����� | gjkmpjdfntkm �����: Posted via ActualForum NNTP Server 1.4 |
4 ��� 09, 10:01����[7493768] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | |||
Naf Member ������: ������ |
| ||
4 ��� 09, 10:11����[7493834] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | ||||
miksoft Member
Oleg SEP001646E Save_DP Ivan 5939 5939 14 14 94(13)
��� ��� �������, ����� ������ � ��������� ����������� ������ �� �����������? | ||||
4 ��� 09, 16:52����[7496964] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | |||||
miksoft Member ������: |
| ||||
4 ��� 09, 18:04����[7497519] �������� | ���������� �������� ���������� |
Re: group by vs distinct [new] | |
gjkmpjdfntkm Member SEP001B0 Oracle mechanics07.07.2009Использование DISTINCT vs EXISTS vs GROUP BY в подзапросахИнтересное наблюдение за поведением Oracle CBO на примере трёх идентичных (по результату) запросов: У двух первых запросов планы выполнения одинаковые, а точнее в обоих случаях Oracle CBO использует механизм semi-join (операция HASH JOIN SEMI), предназначенный специально для подзапросов с конструкцией EXISTS: что лишний раз подтверждает эквивалентность (в данном конкретном случае) запросов №1 (distinct) и №2 (exists) с точки зрения Oracle CBO: План выполнения последнего варианта запроса (group by) отличается использованием механизмов HASH GROUP BY либо SORT GROUP BY в зависимости от статистики объектов и системы. Важно, что при использовании group by в подзапросе CBO не использует механизм объединения запросов (unnest and merge) для поиска оптимального плана выполнения. Таким образом, с помощью изменения синтаксиса подзапроса (выбирая между distinct|exists и group by) можно однозначно определить будет ли использоваться объединение подзапросов (nested или unnested subquery) при выполнении запроса Oracle: Кроме того, в последнем разделе плана можно увидеть замечательный фильтр: filter( EXISTS (SELECT /*+ */ 0 FROM «EMP» «E» WHERE «E».»MGR»>0 GROUP BY «E».»ENAME» HAVING «E».»ENAME»=:B1)) , ещё раз напоминающий об эквивалентности [результатов] запросов 🙂 Есть ли разница между GROUP BY и DISTINCTНа днях я узнал кое-что простое о SQL: Имеет тот же результат, что и: Что мне интересно, есть ли что-то другое в том, как движок SQL обрабатывает команду, или это действительно одно и то же? Лично я предпочитаю четкий синтаксис, но я уверен, что это больше по привычке, чем что-либо еще. EDIT: это не вопрос об агрегатах. Использование GROUP BY с агрегатными функциями понятно. 25 ответовЯ пытался улучшить время выполнения запросов для существующего приложения, управляемого базой данных Oracle, которое работает немного вяло. Приложение выполняет несколько больших запросов, таких как приведенный ниже, выполнение которых может занять более часа. Замена предложения DISTINCT на GROUP. Я понимаю, что в (моем)SQL a SELECT DISTINCT должен делать то же самое, что и A GROUP BY для всех столбцов, за исключением того, что GROUP BY выполняет неявную сортировку, поэтому эти два запроса должны быть одинаковыми: SELECT boardID,threadID FROM posts GROUP BY boardID,threadID ORDER BY NULL. Молоток может иногда работать, чтобы вбить винт, но если у вас есть отвертка под рукой, Зачем беспокоиться? (для целей этой аналогии Hammer : Screwdriver :: GroupBy : Distinct и screw => get list of unique values in a table column ) Например, если у вас есть куча записей о закупках, и вы хотите знать, сколько было потрачено каждым отделом, вы можете сделать что-то вроде: Это даст вам одну строку для каждого отдела, содержащую название отдела и сумму всех значений amount во всех строках для этого отдела. В чем разница с точки зрения простой функциональности удаления дубликатовВот наиболее важные операции: Как вы можете видеть, логический порядок каждой операции влияет на то, что с ней можно сделать и как она влияет на последующие операции. В частности, тот факт, что операция GROUP BY «happens before» операция SELECT (проекция) означает, что: 1. Это не зависит от проекцииПример, когда не зависит от проекции, полезен, если вы хотите вычислить оконные функции по различным значениям: При запуске с базой данных Sakila это дает: То же самое не могло быть достигнуто с DISTINCT легко: Этот запрос «wrong» и дает что-то вроде: 2. Он не может использовать какие-либо значения из проекцииОдним из недостатков SQL является его временами многословие. По той же причине, что и то, что мы видели раньше (а именно логический порядок операций), мы не можем «easily» group by что-то проецировать. Это недопустимо SQL: Это допустимо (повторение выражения) Это тоже верно (вложенность выражения) когда я использую mysql, я получил эту ошибку, и, пожалуйста, кто-нибудь может объяснить мне это. в чем разница между A, B, C из следующих? A) select * from table where a=a group by(b) // this execute & work fine B) select * from table where a=a group by b,c // this execute * work fine c). Я новичок в SQL и запутываюсь в разнице в следующих двух запросах: Выберите MAX(версия), * FROM таблица WHERE primary_key = @key GROUP BY местоположение SELECT версия, * FROM таблица WHERE primary_key = @key GROUP BY расположение HAVING версия = MAX(версия) Предположим, что таблица выглядит. Нет никакой разницы (по крайней мере, в SQL Server). Оба запроса используют один и тот же план выполнения. Может быть, есть разница, если есть подзапросы: Нет никакой разницы (Oracle-style): Я ожидаю, что есть возможность для тонких различий в их исполнении. Я проверил планы выполнения двух функционально эквивалентных запросов в этом направлении в Oracle 10g: Средняя операция немного отличается: «HASH GROUP BY» против «HASH UNIQUE», но расчетные затраты и т. д. идентичны. Затем я выполнил их с помощью трассировки, и фактическое количество операций было одинаковым для обоих (за исключением того, что второму не нужно было делать никаких физических чтений из-за кэширования). Но я думаю, что, поскольку имена операций различны, выполнение будет следовать несколько разным путям кода, и это открывает возможность более существенных различий. Я думаю, что для этой цели вам следует предпочесть синтаксис DISTINCT. Это не просто привычка, это более четко указывает на цель запроса. Для запроса, который вы разместили, они идентичны. Но для других запросов это может быть неверно. Например, это не то же самое, что: Я прочитал все вышеприведенные комментарии, но не увидел, чтобы кто-то указывал на основное различие между Group By и Distinct, кроме бита агрегации. Distinct возвращает все строки, а затем де-дублирует их, в то время как Group By де-дедуплицирует строки по мере их чтения алгоритмом один за другим. Это означает, что они могут давать разные результаты! Например, приведенные ниже коды генерируют различные результаты: Если в таблице есть 10 имен, 1 из которых является дубликатом другого, то первый запрос возвращает 10 строк, тогда как второй запрос возвращает 9 строк. Причина в том, что я сказал выше, чтобы они могли вести себя по-другому! Если вы используете DISTINCT с несколькими столбцами, результирующий набор не будет сгруппирован, как это будет с GROUP BY, и вы не сможете использовать агрегатные функции с DISTINCT. Они имеют различную семантику, даже если они имеют эквивалентные результаты по вашим конкретным данным. GROUP BY имеет очень специфическое значение, которое отличается (Хе) от функции DISTINCT. GROUP BY приводит к тому, что результаты запроса группируются с использованием выбранного выражения, затем могут быть применены агрегатные функции, которые будут действовать на каждую группу, а не на весь результирующий набор. Вот пример, который может помочь: Учитывая таблицу, которая выглядит следующим образом: Будет производить продукцию, как это: Что, очевидно, очень отличается от использования DISTINCT. Если вы хотите сгруппировать свои результаты, используйте GROUP BY, если вам просто нужен уникальный список определенного столбца, используйте DISTINCT. Это даст вашей базе данных возможность оптимизировать запрос для ваших нужд. Пожалуйста, не используйте GROUP BY, когда вы имеете в виду DISTINCT, даже если они работают одинаково. Я предполагаю, что вы пытаетесь срезать миллисекунды с запросов, и я должен отметить, что время разработчика на порядки дороже, чем компьютерное время. Если вы используете GROUP BY без какой-либо агрегатной функции, то внутренне он будет рассматриваться как DISTINCT, поэтому в этом случае нет никакой разницы между GROUP BY и DISTINCT. Но когда вам предоставляется предложение DISTINCT, лучше использовать его для поиска ваших уникальных записей, потому что цель GROUP BY-добиться агрегации. distinct-это то, как это звучит-вы получаете уникальные строки. В sql server 2005, похоже, оптимизатор запросов способен оптимизировать разницу в упрощенных примерах, которые я запускал. Не знаю, можете ли вы рассчитывать на это во всех ситуациях. С точки зрения набора результатов не имеет значения, используете ли вы DISTINCT или GROUP BY в Teradata. Набор ответов будет таким же. С точки зрения производительности это не одно и то же. Чтобы понять, что влияет на производительность, вам нужно знать, что происходит в Teradata при выполнении оператора с DISTINCT или GROUP BY. В случае DISTINCT строки перераспределяются немедленно без какого-либо предварительного объединения, в то время как в случае GROUP BY на первом этапе выполняется предварительное объединение, и только затем уникальные значения перераспределяются по AMPs. Не думайте сейчас, что GROUP BY всегда лучше с точки зрения производительности. Когда у вас много разных значений, шаг предварительной подготовки GROUP BY не очень эффективен. Teradata должна отсортировать данные, чтобы удалить дубликаты. В этом случае может быть лучше сначала выполнить перераспределение, т. Е. Использовать оператор DISTINCT. Только если существует много повторяющихся значений, оператор GROUP BY, вероятно, является лучшим выбором, так как только выполняется шаг дедупликации, после перераспределения. Короче говоря, DISTINCT против GROUP BY в Teradata означает: Если это произойдет, у вас, вероятно, будет больше шансов с GROUP BY, так как дубликаты уже удаляются на первом шаге, и меньше данных перемещается по AMPs. В этом конкретном вопросе нет никакой разницы. Но, конечно, если вы добавите какие-либо агрегатные столбцы, вам придется использовать group by. С точки зрения «SQL языка» эти две конструкции эквивалентны, и какой из них вы выберете, является одним из тех ‘lifestyle’ вариантов, которые мы все должны сделать. Я думаю, что есть хороший случай для того, чтобы DISTINCT был более явным (и поэтому более внимательным к человеку, который унаследует ваш код и т. д.), Но это не означает, что конструкция GROUP BY является недопустимым выбором. Идеальный оптимизатор распознает эквивалентные конструкции SQL и всегда выбирает идеальный план соответственно. Для вашей реальной жизни SQL движок выбора, вы должны проверить 🙂 PS Примечание позиция ключевого слова DISTINCT в предложении select может давать различные результаты, например контраст: Я знаю, что это старая почта. Но так получилось, что у меня был запрос, который использовал group by только для возврата различных значений при использовании этого запроса в отчетах toad и oracle все работало нормально, я имею в виду хорошее время отклика. Когда мы перешли с Oracle 9i на 11g, время отклика в Toad было отличным, но в отчете потребовалось около 35 минут, чтобы закончить отчет, при использовании предыдущей версии это заняло около 5 минут. Решение состояло в том, чтобы изменить group by и использовать DISTINCT, и теперь отчет выполняется примерно за 30 секунд. Я надеюсь, что это полезно для кого-то с такой же ситуацией. Вы замечаете это только потому, что выбираете один столбец. Попробуйте выбрать два поля и посмотреть, что получится. Group By предназначен для использования следующим образом: Который показывал бы сумму всех транзакций для каждого человека. Иногда они могут дать вам те же результаты, но они предназначены для использования в разных sense/case. основное различие заключается в синтаксисе. С точки зрения использования, GROUP BY используется для группировки тех строк, которые вы хотите вычислить. DISTINCT не будет делать никаких вычислений. Он не будет показывать повторяющихся строк. Я всегда использовал DISTINCT, если хотел представить данные без дубликатов. Если я хочу сделать вычисления, такие как суммирование общего количества манго, я буду использовать GROUP BY это то же самое, что: Как правило, мы можем использовать DISTINCT для устранения дубликатов в определенном столбце таблицы. Похожие вопросы:Возможный Дубликат : Есть ли какая-то разница между Group By и Distinct В чем разница между GROUP BY и DISTINCT в запросе MySQL? Я пытался улучшить время выполнения запросов для существующего приложения, управляемого базой данных Oracle, которое работает немного вяло. Приложение выполняет несколько больших запросов, таких как. Я понимаю, что в (моем)SQL a SELECT DISTINCT должен делать то же самое, что и A GROUP BY для всех столбцов, за исключением того, что GROUP BY выполняет неявную сортировку, поэтому эти два запроса. когда я использую mysql, я получил эту ошибку, и, пожалуйста, кто-нибудь может объяснить мне это. в чем разница между A, B, C из следующих? A) select * from table where a=a group by(b) // this. Я новичок в SQL и запутываюсь в разнице в следующих двух запросах: Выберите MAX(версия), * FROM таблица WHERE primary_key = @key GROUP BY местоположение SELECT версия, * FROM таблица WHERE. В чем разница между DISTINCT и GROUP BY? Я понимаю, что DISTINCT удаляет реплицированные значения и GROUP BY часто используется с агрегатными функциями, но почему это происходит в следующем коде. Есть ли потенциал для различных результатов в этих двух запросах? Есть ли тот, который предпочтительнее? SELECT COUNT(DISTINCT a.id, b.id) AS `count` FROM a JOIN b ON a.id = b.a_id против. SELECT. MySQL DistinctВыражение MySQL DISTINCT используется для выборки уникальных значений из указанных столбцов. В этой статье мы покажем, как применять DISTINCT в MySQL с помощью Workbench и командной строки. Синтаксис запросов SELECT DISTINCT в MySQLБазовый синтаксис запросов SELECT DISTINCT : Мы собираемся использовать данные, приведенные ниже, чтобы объяснить применение ключевого слова DISTINCT в MySQL на конкретном примере: DISTINCT-запрос к одному столбцуТеперь я использую ключевое слово DISTINCT : DISTINCT-запрос к нескольким столбцамПример DISTINCT-запроса в MySQL – условие WHEREЗамечание : Выражение DISTINCT в MySQL воспринимает NULL как допустимое уникальное значение. Поэтому используйте любое NOT NULL условие или функцию, чтобы избавиться от этих значений. DISTINCT или GROUP BY в MySQLЕдинственное отличие между ними заключается в следующем: Уберём ключевое слово DISTINCT и используем выражение GROUP BY : Как видите, запрос возвращает тот же результат, но в другом порядке: В этом MySQL SELECT DISTINCT примере я использую выражение ORDER BY : Результат тот же, что и при использовании GROUP BY : Пример DISTINCT-запроса в MySQL – командная строкаТеперь я покажу, как отобразить уникальные записи с помощью SELECT DISTINCT MySQL в командной строки. В этом случае мы выбираем записи с уникальными значениями столбцов education и profession из таблицы customerdetails : Пожалуйста, оставляйте свои мнения по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, отклики, дизлайки, лайки! Дайте знать, что вы думаете по этой теме статьи в комментариях. За комментарии, дизлайки, лайки, подписки, отклики огромное вам спасибо!
|