какое отличие 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, как это

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

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

Источник

Is there any difference between GROUP BY and DISTINCT

I learned something simple about SQL the other day:

Has the same result as:

What I am curious of, is there anything different in the way an SQL engine processes the command, or are they truly the same thing?

I personally prefer the distinct syntax, but I am sure it’s more out of habit than anything else.

EDIT: This is not a question about aggregates. The use of GROUP BY with aggregate functions is understood.

26 Answers 26

A hammer can work to drive in a screw sometimes, but if you’ve got a screwdriver handy, why bother?

(for the purposes of this analogy, Hammer : Screwdriver :: GroupBy : Distinct and screw => get list of unique values in a table column )

For example, if you have a bunch of purchase records, and you want to know how much was spent by each department, you might do something like:

This will give you one row per department, containing the department name and the sum of all of the amount values in all rows for that department.

What’s the difference from a mere duplicate removal functionality point of view

Here are the most important operations:

As you can see, the logical order of each operation influences what can be done with it and how it influences subsequent operations. In particular, the fact that the GROUP BY operation «happens before» the SELECT operation (the projection) means that:

1. It doesn’t depend on the projection

An example where not depending on the projection is useful is if you want to calculate window functions on distinct values:

When run against the Sakila database, this yields:

The same couldn’t be achieved with DISTINCT easily:

That query is «wrong» and yields something like:

2. It cannot use any values from the projection

One of SQL’s drawbacks is its verbosity at times. For the same reason as what we’ve seen before (namely the logical order of operations), we cannot «easily» group by something we’re projecting.

This is invalid SQL:

This is valid (repeating the expression)

This is valid, too (nesting the expression)

There is no difference (in SQL Server, at least). Both queries use the same execution plan.

Maybe there is a difference, if there are sub-queries involved:

There is no difference (Oracle-style):

какое отличие distinct и group by

I expect there is the possibility for subtle differences in their execution. I checked the execution plans for two functionally equivalent queries along these lines in Oracle 10g:

The middle operation is slightly different: «HASH GROUP BY» vs. «HASH UNIQUE», but the estimated costs etc. are identical. I then executed these with tracing on and the actual operation counts were the same for both (except that the second one didn’t have to do any physical reads due to caching).

But I think that because the operation names are different, the execution would follow somewhat different code paths and that opens the possibility of more significant differences.

I think you should prefer the DISTINCT syntax for this purpose. It’s not just habit, it more clearly indicates the purpose of the query.

For the query you posted, they are identical. But for other queries that may not be true.

For example, it’s not the same as:

I read all the above comments but didn’t see anyone pointed to the main difference between Group By and Distinct apart from the aggregation bit.

Distinct returns all the rows then de-duplicates them whereas Group By de-deduplicate the rows as they’re read by the algorithm one by one.

This means they can produce different results!

For example, the below codes generate different results:

If there are 10 names in the table where 1 of which is a duplicate of another then the first query returns 10 rows whereas the second query returns 9 rows.

The reason is what I said above so they can behave differently!

If you use DISTINCT with multiple columns, the result set won’t be grouped as it will with GROUP BY, and you can’t use aggregate functions with DISTINCT.

They have different semantics, even if they happen to have equivalent results on your particular data.

GROUP BY has a very specific meaning that is distinct (heh) from the DISTINCT function.

GROUP BY causes the query results to be grouped using the chosen expression, aggregate functions can then be applied, and these will act on each group, rather than the entire resultset.

Here’s an example that might help:

Given a table that looks like this:

Will produce output like this:

Which is obviously very different from using DISTINCT. If you want to group your results, use GROUP BY, if you just want a unique list of a specific column, use DISTINCT. This will give your database a chance to optimise the query for your needs.

If you are using a GROUP BY without any aggregate function then internally it will treated as DISTINCT, so in this case there is no difference between GROUP BY and DISTINCT.

But when you are provided with DISTINCT clause better to use it for finding your unique records because the objective of GROUP BY is to achieve aggregation.

Please don’t use GROUP BY when you mean DISTINCT, even if they happen to work the same. I’m assuming you’re trying to shave off milliseconds from queries, and I have to point out that developer time is orders of magnitude more expensive than computer time.

какое отличие distinct и group by

In sql server 2005, it looks like the query optimizer is able to optimize away the difference in the simplistic examples I ran. Dunno if you can count on that in all situations, though.

From a result set point of view, it does not matter if you use DISTINCT or GROUP BY in Teradata. The answer set will be the same.

From a performance point of view, it is not the same.

To understand what impacts performance, you need to know what happens on Teradata when executing a statement with DISTINCT or GROUP BY.

In the case of DISTINCT, the rows are redistributed immediately without any preaggregation taking place, while in the case of GROUP BY, in a first step a preaggregation is done and only then are the unique values redistributed across the AMPs.

Don’t think now that GROUP BY is always better from a performance point of view. When you have many different values, the preaggregation step of GROUP BY is not very efficient. Teradata has to sort the data to remove duplicates. In this case, it may be better to the redistribution first, i.e. use the DISTINCT statement. Only if there are many duplicate values, the GROUP BY statement is probably the better choice as only once the deduplication step takes place, after redistribution.

In short, DISTINCT vs. GROUP BY in Teradata means:

If this happens, you have probably a better chance with GROUP BY, as duplicates are already removed in a first step, and less data is moved across the AMPs.

Источник

MySQL Distinct

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

Синтаксис запросов SELECT DISTINCT в MySQL

Базовый синтаксис запросов SELECT DISTINCT :

Мы собираемся использовать данные, приведенные ниже, чтобы объяснить применение ключевого слова DISTINCT в MySQL на конкретном примере:

какое отличие distinct и group by

DISTINCT-запрос к одному столбцу

какое отличие distinct и group by

Теперь я использую ключевое слово DISTINCT :

какое отличие distinct и group by

DISTINCT-запрос к нескольким столбцам

какое отличие distinct и group by

Пример DISTINCT-запроса в MySQL – условие WHERE

какое отличие distinct и group by

Замечание : Выражение DISTINCT в MySQL воспринимает NULL как допустимое уникальное значение. Поэтому используйте любое NOT NULL условие или функцию, чтобы избавиться от этих значений.

DISTINCT или GROUP BY в MySQL

Единственное отличие между ними заключается в следующем:

какое отличие distinct и group by

Уберём ключевое слово DISTINCT и используем выражение GROUP BY :

Как видите, запрос возвращает тот же результат, но в другом порядке:

какое отличие distinct и group by

В этом MySQL SELECT DISTINCT примере я использую выражение ORDER BY :

Результат тот же, что и при использовании GROUP BY :

какое отличие distinct и group by

Пример DISTINCT-запроса в MySQL – командная строка

Теперь я покажу, как отобразить уникальные записи с помощью SELECT DISTINCT MySQL в командной строки. В этом случае мы выбираем записи с уникальными значениями столбцов education и profession из таблицы customerdetails :

какое отличие distinct и group by

Пожалуйста, оставляйте свои мнения по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, отклики, дизлайки, лайки!

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

Источник

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

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

Имеет такой же результат, как:

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

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

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

Ответ MusiGenesis является функционально правильным в отношении вашего вопроса, как указано; SQL Server достаточно умен, чтобы понять, что если вы используете «Group By» и не используете какие-либо агрегированные функции, то то, что вы на самом деле имеете в виду, это «Distinct» – и поэтому оно генерирует план выполнения, как если бы вы просто использовали «Distinct «.

Тем не менее, я думаю, что важно также отметить реакцию Хэнка – кавалерийское обращение с «Группой» и «Дикстрим» может привести к пагубной игре, если вы не будете осторожны. Не совсем правильно сказать, что это «не вопрос об агрегатах», потому что вы спрашиваете о функциональном различии между двумя ключевыми словами SQL-запроса, один из которых предназначен для использования с агрегатами, а один из них – нет.

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

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

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

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

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

Нет никакой разницы (стиль Oracle):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В чем отличие от простой точки дублирования точки доступа

Вот наиболее важные операции:

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

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

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

При работе с базой данных Sakila это дает:

DISTINCT не может быть легко:

Этот запрос является «неправильным» и дает что-то вроде:

Примечание. В этом конкретном случае мы также DENSE_RANK() использовать DENSE_RANK()

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

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

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

Это также верно (вложение выражения)

Я написал об этой теме более подробно в сообщении в блоге

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

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

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

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

Будет производить вывод следующим образом:

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

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

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

group by используется в совокупных операциях – например, когда вы хотите получить счет Bs, разбитый столбцом C

Различия в том, как это звучит – вы получаете уникальные строки.

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

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

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

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

Я думаю, что это «GROUP BY для агрегатов» – это неправильный акцент. Фолк должен знать, что функция set (MAX, MIN, COUNT и т. Д.) Может быть опущена, чтобы они могли понять намерение кодера, когда оно есть.

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

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

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

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

Группа «В» предназначена для использования следующим образом:

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

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

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

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

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

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

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

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

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

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

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

Объявить таблицу @tmpresult (Id tinyint)

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

Выберите отдельный идентификатор из @tmpresult

Источник

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

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

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

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

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

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

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

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

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

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

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

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

Разницы нет (в стиле Oracle):

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

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

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

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

При запуске с базой данных Sakila это дает:

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

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

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

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

Это верно (повторяет выражение)

Это также верно (вложенное выражение)

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

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

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

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

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

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

Distinct возвращает все строки, а затем дедуплицирует их, тогда как Group By дедуплицирует строки, когда они читаются алгоритмом одна за другой.

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

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

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

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

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

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

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

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

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

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

Короче говоря, DISTINCT против GROUP BY в Teradata означает:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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