|
Страници по тази тема: 1 | 2 | 3 | >> (покажи всички)
Тема
|
DISTINCT vs GROUP BY
|
|
Автор |
Dakota (гол на деня) |
Публикувано | 14.01.03 17:20 |
|
Това два различни начина за групиране ли са или просто DISTINCT не подрежда резултата?
И ако са различни, какви са останалите разлики?
Визирам mySQL.
"Да живееш - значи да се променяш." - Анатол ФрансРедактирано от Dakota на 14.01.03 17:21.
| |
Тема
|
Re: DISTINCT vs GROUP BY
[re: Dakota]
|
|
Автор |
бaй Любo (#!/usr/bin/ksh) |
Публикувано | 14.01.03 21:25 |
|
Х-м...
--дистинкт не е начин за групиране а просто връща различните стойности.
--Нито дистинкт нито груп бай сортира резултата -- сортирането се управлява от ордер бай, което е съвсем различна клауза.
--за сметка на това и двете (дистинкт и груп бай) използват вътрешна сортировка за да си свършат работата.
-- Някои заявки може да се напишат обаче и по двата начина. Например:
create table t (a int, b int)
insert ..... (да има нещо в таблицата)
select distinct a from t
select a from t group by a
Двата селецта връшат едно и също нещо. Може и да са еднакво бързи (зависи от конкретната субд), но втория ще бъде пълна загадка за човека който ще ти поддържа апликейшъна.
Забележи че
select distinct a, b from t
връща различните двойки (a,b).
Целта на group by е да сметне нещо за групата (т.нар. vector aggregate). Naprimer:
select a, sum(b) from t
или вместо сум: avg|min|max|count (тия aggregate functions се сещам в момента).
Spored SQL standarta в списъка на колоните могат да фигурират само колони изброени в клаузата group by, плюс агрегиращи функции. Някои субд обаче (сайбейс, мс sql server) не налагат това ограничение, което дава възможности за някои хитри приложения.
| |
Тема
|
Re: DISTINCT vs GROUP BY
[re: бaй Любo]
|
|
Автор |
salle (новак) |
Публикувано | 15.01.03 05:15 |
|
А в някои СУБД (MySQL) в GROUP BY клаузата могат да фигурират колони, които липсват в SELECT частта.
Което дава възможност за още по-хитри приложения ... а също така и за страхотно объркване.
SELECT SUM(a) FROM t GROUP BY b;
| |
|
GROUP BY сортира резултата. Ето виж:
mysql> select id from test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 2 |
| 3 |
+------+
5 rows in set (0.00 sec)
DISTINCT:
mysql> select distinct id from test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
+------+
3 rows in set (0.00 sec)
GROUP BY:
mysql> select id from test group by id;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
Затова ми се струва, че DISTINCT би трябвало да е по-бърз.
"Да живееш - значи да се променяш." - Анатол Франс
| |
|
не съм правил тестове, но и аз си мисля, че може би DISTINCT, ще е по-бърз, когато обаче върши работа - когато не върши нужната работа естествено .... не ;-)
но на това, че GROUP BY сортира - изобщо не трябва да разчиташ
| |
Тема
|
Re: не съвсем
[re: phpGuru]
|
|
Автор |
Dakota (гол на деня) |
Публикувано | 15.01.03 14:56 |
|
Мда...винаги се застраховам и с един ORDER BY, просто това е страничният ефект на GROUP BY, който понякога е доста нежелателен.
"Да живееш - значи да се променяш." - Анатол Франс
| |
Тема
|
неведоми са пътищата..
[re: Dakota]
|
|
Автор |
бaй Любo (#!/usr/bin/ksh) |
Публикувано | 16.01.03 01:13 |
|
Ми като го гледам твоя пример и двата резултата са сортирани, което според мен е следствие от това че и двата алгоритъма сортират. Както обаче вече посочиха, не леж на това ухо щото няма гаранция.
Що се отнася до бързината, интуитивно човек си мисли че дистинкта ще е по бърз обаче направих един опит и ето:
в/у таблица от 180,000 реда рънвам
set statistics io on
select distinct sp_name from sp_summary
select sp_name, count(*) from sp_summary group by sp_name
go
Първота заявка ми струва 7457 лог. И/Ота за да прочете таблицата плюс още 188318 лог. И/О-та в/у междинна таблица за сортировка и да извади дистинкта.
За втората заявка пак прави 7457 лог. И/Ота за да прочете таблицата и след това 27000 лог. И/Ота за сортирорка и да сметне каунта.
Излиза че груп бай е около 10 пъти по-бързо!!
Разбира се зависи от субд-то (сайбейс в моя случай), конфигурацията и т.н., но това което искам да кажа е че никога не знаеш докато не го тестваш.
Дистинкт:
grep Table tt.out
Table: sp_summary scan count 1, logical reads: (regular=7457 apf=0
Table: Worktable1 scan count 0, logical reads: (regular=188318 apf=0
Груп бай
Table: sp_summary scan count 1, logical reads: (regular=7457 apf=0
Table: Worktable1 scan count 1, logical reads: (regular=27000 apf=0
| |
Тема
|
Re: неведоми са пътищата..
[re: бaй Любo]
|
|
Автор |
salle (новак) |
Публикувано | 16.01.03 04:29 |
|
.... И тамън си го изтествал и изведнъж се оказва, че разпределението на стойностите вече е съвсем друго и всъщност е наопаки
Изобщо накрая опираш до Универсалния Отговор На Всички Въпроси Свързани С Бази Данни:
Зависи!
Бай Любо. Що по-често не се отбиваш тука а?
Редактирано от salle на 16.01.03 04:31.
| |
Тема
|
Re: неведоми са пътищата..
[re: бaй Любo]
|
|
Автор |
Dakota (гол на деня) |
Публикувано | 16.01.03 11:43 |
|
1, 3, 2 не ми се вижда сортирано, поне не и по големина? ![](http://i.dirbg.com/clubs/icons/smile.gif)
"Да живееш - значи да се променяш." - Анатол Франс
| |
Тема
|
Re: неведоми са пътищата..
[re: Dakota]
|
|
Автор | svircho (Нерегистриран) |
Публикувано | 16.01.03 12:06 |
|
GROUP BY винаги сортира в нарастващ ред. Ако искате да сортирате в намаляващ ред, коагто имате GROUP BY използвайте ORDER BY column_name DESC
| |
|
Страници по тази тема: 1 | 2 | 3 | >> (покажи всички)
|
|
|