Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 01:52 01.07.24 
Компютри и Интернет
   >> Бази данни
*Кратък преглед

Страници по тази тема: 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;



Тема не съвсемнови [re: бaй Любo]  
Автор Dakota (гол на деня)
Публикувано15.01.03 12:49



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 би трябвало да е по-бърз.

"Да живееш - значи да се променяш." - Анатол Франс


Тема Re: не съвсемнови [re: Dakota]  
Автор phpGuruАдминистратор (непознат)
Публикувано15.01.03 13:29



не съм правил тестове, но и аз си мисля, че може би 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 не ми се вижда сортирано, поне не и по големина?

"Да живееш - значи да се променяш." - Анатол Франс


Тема Re: неведоми са пътищата..нови [re: Dakota]  
Авторsvircho (Нерегистриран)
Публикувано16.01.03 12:06



GROUP BY винаги сортира в нарастващ ред. Ако искате да сортирате в намаляващ ред, коагто имате GROUP BY използвайте ORDER BY column_name DESC




Страници по тази тема: 1 | 2 | 3 | >> (покажи всички)
*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.