postgresql что быстрее group by или distinct

What’s faster, SELECT DISTINCT or GROUP BY in MySQL?

and I want to get all unique values of profession field, what would be faster (or recommended):

16 Answers 16

They are essentially equivalent to each other (in fact this is how some databases implement DISTINCT under the hood).

When in doubt, test!

GROUP BY in MySQL sorts results. You can even do:

and get your professions sorted in DESC order.

DISTINCT creates a temporary table and uses it for storing duplicates. GROUP BY does the same, but sortes the distinct results afterwards.

All of the answers above are correct, for the case of DISTINCT on a single column vs GROUP BY on a single column. Every db engine has its own implementation and optimizations, and if you care about the very little difference (in most cases) then you have to test against specific server AND specific version! As implementations may change.

BUT, if you select more than one column in the query, then the DISTINCT is essentially different! Because in this case it will compare ALL columns of all rows, instead of just one column.

So if you have something like:

It is a common mistake to think that DISTINCT keyword distinguishes rows by the first column you specified, but the DISTINCT is a general keyword in this manner.

So people you have to be careful not to take the answers above as correct for all cases. You might get confused and get the wrong results while all you wanted was to optimize!

Источник

Что быстрее, выберите 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, как это

более быстрый ответ был бы:

это не всегда возможно, но при наличии вы увидите более быстрый ответ.

Источник

Что быстрее, SELECT DISTINCT или GROUP BY в MySQL?

Если у меня есть таблица

ОТВЕТЫ

Ответ 1

Они по существу эквивалентны друг другу (на самом деле это то, как некоторые базы данных реализуют DISTINCT под капотом).

Если вы сомневаетесь, проверьте!

Ответ 2

GROUP BY в MySQL сортирует результаты. Вы даже можете сделать:

DISTINCT создает временную таблицу и использует ее для хранения дубликатов. GROUP BY делает то же самое, но потом сортирует отдельные результаты.

Ответ 3

Ответ 4

Все приведенные выше ответы верны, в случае DISTINCT в одном столбце против GROUP BY в одном столбце. Каждый движок db имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень небольшой разнице (в большинстве случаев), вам нужно протестировать конкретную версию сервера и конкретной версии! Поскольку реализации могут меняться.

НО, если вы выберете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае он будет сравнивать ВСЕ столбцы всех строк, а не только один столбец.

Итак, если у вас есть что-то вроде:

Общей ошибкой считается мысль о том, что ключевое слово DISTINCT различает строки по указанному первому столбцу, но DISTINCT является ключевым словом в этом виде.

Итак, люди, которым вы должны быть осторожны, чтобы не принимать ответы выше, как правильные для всех случаев. Вы можете запутаться и получить неправильные результаты, пока все, что вы хотели, было оптимизировать!

Ответ 5

хорошо различий может быть медленнее, чем группа в некоторых случаях в postgres (не знаю о других dbs).

поэтому будьте осторожны. )

Ответ 6

Кажется, что запросы не совсем одинаковы. По крайней мере, для MySQL.

Второй запрос дополнительно добавляет «Использование filesort» в Экземпляр.

Ответ 7

Группировка дороже, чем Distinct, так как Group by делает сортировку результата, а отчетливо избегает ее. Но если вы хотите, чтобы группа с уроком получала тот же результат, что и разные, давайте порядок по null..

равно

Ответ 8

(больше функциональной заметки)

Есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на одного работодателя:

В таком сценарии DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто этого не знаю. (Если кто-то знает, как сделать такой запрос с DISTINCT, добавьте примечание!)

Ответ 9

Ответ 10

После тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее

SELECT sql_no_cache opnamegroep_intern FROM telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) ​​группа by opnamegroep_intern

SELECT sql_no_cache отличный (opnamegroep_intern) FROM telwerken ГДЕ opnemergroep IN (7,8,9,10,11,12,13) ​​

Ответ 11

Для каждого запроса. попробуйте отдельно различать, а затем группировать по. сравните время, чтобы завершить каждый запрос и использовать быстрее.

В моем проекте когда-то я использую группу by и другие разные

Ответ 12

Вот простой подход, который будет печатать два разных прошедшего времени для каждого запроса.

Он просто отображает количество миллисекунд, необходимых для синтаксического анализа, компиляции и выполнения каждого оператора, как показано ниже:

Ответ 13

Если вам не нужно выполнять какие-либо групповые функции (сумма, среднее значение и т.д., если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее, но мне нечего это показывать.

В любом случае, если вы беспокоитесь о скорости, создайте индекс в столбце.

Ответ 14

SELECT DISTINCT всегда будет тем же или быстрее, чем GROUP BY. В некоторых системах (например, Oracle) оптимизация может быть такой же, как DISTINCT для большинства запросов. В других (например, SQL Server) это может быть значительно быстрее.

Ответ 15

Если проблема позволяет, попробуйте с EXISTS, так как он оптимизирован для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, подобного этому

Более быстрый ответ:

Это не всегда возможно, но при наличии вы увидите более быстрый ответ.

Источник

Есть ли разница между GROUP BY и DISTINCT

на днях я узнал кое-что простое о SQL:

имеет тот же результат, что и:

что мне интересно, есть ли что-то другое в том, как SQL engine обрабатывает команду, или они действительно одно и то же?

Я лично предпочитаю отдельный синтаксис, но я уверен, что это больше по привычке, чем что-либо еще.

EDIT: это не вопрос о агрегатах. Использование GROUP BY с суммарным функции понятны.

24 ответов

молоток может работать, чтобы вбить винт иногда, но если у вас есть отвертка под рукой, Зачем беспокоиться?

(. для цели этой аналогии, Hammer : Screwdriver :: GroupBy : Distinct и screw => get list of unique values in a table column )

например, если у вас есть куча записей о покупке, и вы хотите знать, сколько было потрачено каждым отделом, вы можете сделать что-то вроде:

это даст вам одну строку на отдел, содержащий название отдела и сумму всех amount значения во всех строках за что отдел.

нет никакой разницы (по крайней мере, в SQL Server). Оба запроса используют один и тот же план выполнения.

может быть is разница, если есть подзапросы:

нет разница (Oracle-style):

в чем разница с точки зрения функциональности простого удаления дубликатов

вот самые важные операции:

как вы можете видеть, логический порядок каждой операции влияет на то, что с ней можно сделать и как она влияет на последующие операции. В частности, тот факт, что GROUP BY операция «происходит перед» the SELECT операция (проекция) означает, что:

1. Это не зависит от проекции

пример, где не зависит от проекции полезно, если вы хотите рассчитать оконные функции на различных значениях:

при запуске против у sakila базе получается:

то же самое не может быть достигнуто с DISTINCT легко:

запрос-это «неправильно» и дает что-то вроде:

2. Он не может использовать значения из проекции

одним из недостатков SQL является его многословие время от времени. По той же причине, по которой мы видели раньше (а именно логический порядок операций), мы не можем «легко» группировать то, что мы проецируем.

это недопустимый SQL:

это действительно (повторяя выражение)

это тоже допустимо (вложенность выражение)

Я ожидаю, что есть возможность для тонких различий в их выполнении. Я проверил планы выполнения для двух функционально эквивалентных запросов по этим строкам в Oracle 10g:

средняя операция немного отличается: «HASH GROUP BY «против» HASH UNIQUE», но оценочные затраты и т. д. идентичны. Затем я выполнил их с трассировкой, и фактические подсчеты операций были одинаковыми для обоих (за исключением того, что второй не должен был делать никаких физических читает из-за кэширования).

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

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

для опубликованного запроса они идентичны. Но для других запросов это может быть неверно.

например, это не то же, что:

Они имеют разную семантику, даже если у них есть эквивалентные результаты по вашим конкретным данным.

Если вы используете DISTINCT с несколькими столбцами, результирующий набор не будет сгруппирован, как это будет с GROUP BY, и вы не можете использовать агрегатные функции с DISTINCT.

Я прочитал все вышеуказанные комментарии, но не видел, чтобы кто-то указывал на основное различие между Group By и Distinct, кроме бита агрегации.

Distinct возвращает все строки, затем де-дублирует их, тогда как Group By de-deduplicate строки, как они читаются алгоритмом один за другим.

Это означает, что они могут давать разные результаты!

например, приведенные ниже коды генерируют разные результаты:

Если есть 10 имен в таблице, где 1 из которых является дубликатом другого, первый запрос возвращает 10 строк, тогда как второй запрос возвращает 9 строк.

причина в том, что я сказал выше, чтобы они могли вести себя по-разному!

GROUP BY имеет очень специфическое значение, которое отличается (heh) от отдельной функции.

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

вот пример, который может помочь:

учитывая таблицу, которая выглядит так:

будет результат это:

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

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

но когда вам предоставляется предложение DISTINCT, лучше использовать его для поиска ваших уникальных записей, потому что цель GROUP BY-достичь агрегации.

distinct-это то, как это звучит-вы получаете уникальные строки.

в sql server 2005, похоже, оптимизатор запросов способен оптимизировать разницу в упрощенных примерах, которые я запускал. Не знаю, можете ли вы рассчитывать на это во всех ситуациях.

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

в этом конкретном запросе нет никакой разницы. Но, конечно, если вы добавите какие-либо агрегированные столбцы, вам придется использовать group by.

С точки зрения «SQL the language» две конструкции эквивалентны, и какой из них вы выбираете, является одним из тех вариантов «образа жизни», которые мы все должны сделать. Я думаю, что есть хороший случай для того, чтобы DISTINCT был более явным (и, следовательно, более внимательным к человеку, который унаследует ваш код и т. д.), Но это не означает, что GROUP BY construct является недопустимым выбором.

Я думаю, что эта «группа ПО для агрегатов» является неправильным акцентом. Люди должны знать, что набор функция (MAX, MIN, COUNT и т. д.) Может быть опущена, чтобы они могли понять намерение кодера, когда оно есть.

идеальный оптимизатор распознает эквивалентные конструкции SQL и всегда будет выбирать идеальный план соответственно. Для вашей реальной жизни SQL engine выбора, вы должны проверить:)

PS обратите внимание, что положение ключевого слова DISTINCT в предложении select может привести к различным результатам, например contrast:

с точки зрения результирующего набора не имеет значения, используете ли вы DISTINCT или GROUP BY в Teradata. Набор ответов будет таким же.

с точки зрения производительности, это не то же самое.

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

в случае DISTINCT строки перераспределяются сразу же без какого-либо предварительного уплотнения, а в случае группы, на первом этапе осуществляется предварительное уплотнение и только тогда являются уникальными значениями перераспределяется через усилители.

Не думайте теперь, что GROUP BY всегда лучше с точки зрения производительности. Когда у вас много разных значений, шаг предварительной Конгрегации GROUP BY не очень эффективен. Teradata должна сортировать данные для удаления дубликатов. В этом случае, возможно, лучше сначала перераспределить, т. е. используйте оператор DISTINCT. Только если существует много повторяющихся значений, оператор GROUP BY, вероятно, является лучшим выбором, так как только шаг дедупликации происходит после перераспределения.

короче говоря, DISTINCT vs. GROUP BY в Teradata означает:

Если это произойдет, у вас, вероятно, больше шансов с GROUP BY, поскольку дубликаты уже удалены на первом шаге, и меньше данных перемещается через усилители.

вы замечаете это только потому, что вы выбираете один столбец.

попробуйте выбрать два поля и посмотреть, что произойдет.

Group By предназначен для использования следующим образом:

который покажет сумму всех транзакций для каждого человека.

Я знаю, что это старый пост. Но бывает, что у меня был запрос, который использовал group by только для возврата различных значений при использовании этого запроса в отчетах toad и oracle, все работало нормально, я имею в виду хорошее время ответа. Когда мы мигрировали с Oracle 9i на 11g, время ответа в Toad было отличным, но в reporte потребовалось около 35 минут, чтобы закончить отчет при использовании предыдущей версии потребовалось около 5 минут.

решение состояло в том, чтобы изменить группу и использовать DISTINCT и теперь отчет запускается примерно через 30 секунд.

Я надеюсь, что это полезно для кого-то такая же ситуация.

Я всегда понимал, что использование distinct-это то же самое, что группирование по каждому выбранному вами полю в том порядке, в котором вы их выбрали.

У меня был этот вопрос раньше, мне нужно добавить три столбца из моей таблицы 4 миллионов строк (три столбца в один новый столбец новой таблицы), но только разные.

поэтому я запустил свою хранимую процедуру, которая содержит этот запрос с помощью метода «group by», и это заняло 32 минуты. Затем я снова запустил его, но с помощью метода «distinct», и это заняло 25 минут.

Это тот же результат, но он был немного быстрее со 2-м методом

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

в Hive (HQL) group by может быть быстрее, чем distinct, потому что первый не требует сравнения всех полей в таблице. Смотри https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct.

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

попробуйте простой пример

объявить таблицу @tmpresult ( Идентификатор тип tinyint )

вставить в @tmpresult Выберите 5 Весь Союз Выберите 2 Союз все Выберите 3 Весь Союз Выберите 4

выберите distinct Идентификатор От @tmpresult

Источник

Что быстрее, выберите DISTINCT или GROUP BY в MySQL?

если у меня есть таблица

и я хочу получить все уникальные значения profession поле, что было бы быстрее (или рекомендуется):

15 ответов:

они по существу эквивалентны друг другу (на самом деле это как некоторые базы данных реализации DISTINCT под капотом).

когда сомневаешься, тест!

если у вас есть индекс на profession эти два слова-синонимы.

GROUP BY на MySQL результаты разные. Вы даже можете сделать:

и получить ваши профессии сортируются в DESC порядок.

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

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

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

Так что если у вас есть что-то вроде:

Это распространенная ошибка думать, что ключевое слово DISTINCT различает строки по первому указанному вами столбцу, но DISTINCT является общим ключевым словом таким образом.

Так что люди, Вы должны быть осторожны, чтобы не принимать ответы выше, Как правильно для всех случаев. Вы можете запутаться и получить неправильные результаты, в то время как все, что вы хотели, было оптимизируйте!

ну distinct может быть медленнее, чем group by в некоторых случаях в postgres (не знаю о других dbs).

кажется, что запросы не совсем совпадают. По крайней мере для MySQL.

второй запрос дает дополнительно «Using filesort» в Extra.

есть случаи, когда вы должны использовать GROUP BY, например, если вы хотите получить количество сотрудников на одного работодателя:

при таком раскладе DISTINCT u.employer не работает правильно. Возможно, есть способ, но я его просто не знаю. (Если кто-то знает, как сделать такой запрос с помощью DISTINCT, пожалуйста, добавьте заметку!)

Если вам не нужно выполнять групповые функции (sum, average и т. д., Если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее,но мне нечего показать.

в любом случае, если вы беспокоитесь о скорости, создать индекс по столбцу.

после тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее

выберите sql_no_cache opnamegroep_intern От telwerken Где opnemergroep в группе (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 разных времени для каждого запроса.

Он просто отображает количество миллисекунд, необходимых для разбора, компиляции и выполнения каждого оператора, как показано ниже:

выбор DISTINCT всегда будет одинаковым или быстрее, чем группа BY. В некоторых системах (например, Oracle) он может быть оптимизирован так же, как и для большинства запросов. На других (например, SQL Server) это может быть значительно быстрее.

Если проблема позволяет это, попробуйте с EXISTS, так как он оптимизирован для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, подобного этому

быстрый ответ будет такой:

это не всегда возможно, но при наличии вы увидите более быстрый ответ.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *