Я просматриваю и изучаю SQL, я замечаю кое-что, что кажется мне любопытным.
Предположим, у меня есть таблица с именем, productos
и одно из ее полей равно categoria
, при выполнении следующих запросов я вижу, что результат тот же:
SELECT DISTINCT categoria FROM productos;
Д
SELECT categoria FROM productos GROUP BY categoria;
Разница, которую я замечаю, заключается в том, что у DISTINCT
меня он фильтрует дубликаты и соблюдает порядок их появления, а в предложении, которое он использует, он GROUP BY
упорядочивает их в алфавитном порядке. Исходя из этого, можно сказать, что первый оператор выполняется быстрее. Если да, то будет ли разница в производительности значительной при обработке больших объемов данных?
Хотя очевидно, что оба метода дают один и тот же конечный результат, не все из них можно рассматривать как пригодные для достижения желаемого результата.
Принимая во внимание сделанное вами предложение, правильно было бы использовать
DISTINCT
, поскольку оно применяется к строке, вместо этогоGROUP BY
было создано для работы с такими агрегатами, какSUM()
,MAX()
,AVG()
и т. д.Вопрос порядка не будет проблемой, потому что можно
ORDER BY
будет разрешить разногласие.В этих ссылках, хотя они и на английском языке, поднимался тот же вопрос:
Есть ли разница между GROUP BY и DISTINCT?
В чем разница между GROUP BY и DISTINCT?
GROUP BY
Используется больше для операций типа:count
,sum
, и т.п.В зависимости от количества записей в таблице (речь идет о миллионах записей)
select
(будь то сdistinct
или сgroup by
) займет более или менее одинаковое времяЕсли дело в том, что таблица содержит миллионы записей (100, 200, 500), иногда лучше всего извлечь данные, которые вы хотите сгруппировать, во временную таблицу (
select ... insert
) и во временной таблице выполнить командуdistinct
или командуgroup by
. Время запроса значительно быстрее.В дополнение к тому, что комментирует Леандро, и как точный перевод одного из ответов в ссылке, которую он сам прикрепляет, ответ зависит от движка, но вы можете иметь область действия этих двух движков базы данных:
РПТА:
Нет никакой разницы (по крайней мере, в SQL Server). Оба запроса используют один и тот же план выполнения.
http://sqlmag.com/database-performance-tuning/distinct-vs-group
Возможно, есть разница, если задействованы подзапросы:
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
Без разницы (в стиле Oracle):
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212
Функция
DISTINCT
удаляет дубликаты записей, функцияGROUP BY
реализована для группировки записей.Функция
DISTINCT
выполняется следующим образом:business_key
значения во временную таблицуФункция
GROUP BY
выполняется как:business_key
вhashtable
hashtable
Первый оптимизирует память, а второй оптимизирует скорость, но требует большого объема памяти в зависимости от количества ключей.
Привет.
Первый вариант просто фильтрует строки по мере их нахождения, но для получения результата необходимо просмотреть их все. Когда вы используете
group by
первичный возвращаемый результат, он повторно обрабатывается для сортировки в соответствии со значением группировки, в вашем случае, по «категории». Без использования индексов первый вариант быстрее. Однако, если вы поместите индекс в поле «категория», запросgroup by
будет почти таким же быстрым. Имейте в виду, что каждая альтернатива используется в соответствии с нужным вам результатом.