Avatar billede lundsfryd Nybegynder
14. september 2001 - 14:56 Der er 5 kommentarer og
1 løsning

GROUP BY - optimering

Lad mig starte lige på og hårdt:

Jeg har en tabel, der indeholder et felt ved navn id (int8) og et felt ved navn tal (int8). Tabellen er lavet for at belyse den ide, jeg kommer ind på om lidt.

Nu prøver jeg at køre en EXPLAIN på flg. query:

SELECT tal FROM tabel GROUP BY tal;

Outputtet er:

Group  (cost=69.83..72.33 rows=100 width=8)
  ->  Sort  (cost=69.83..69.83 rows=1000 width=8)
        ->  Seq Scan on tabel  (cost=0.00..20.00 rows=1000 width=8)

- og her kommer så spørgsmålet: Kan man optimere denne forespørgsel med et eller flere index, således, at:

- Sort\'en kan undgås eller optimeres?
- Seq Scan kan blive til Index Scan?

Som jeg ser det, ville det være en god måde at optimere på - men jeg har brug for et par tips til, hvordan/om, det kan gøres i praksis :)
Avatar billede coderdk Praktikant
15. september 2001 - 02:29 #1
Prøv at lave en explain på samme query efter du har tilføjet dette index:

  CREATE INDEX \"tabel_idx\" ON \"tabel\" USING BTREE (\"tal\");

Du skulle gerne se en voldsom forbedring... Der burde ikke være nogen sort i hvert tilfælde =) Kun group...
Avatar billede lundsfryd Nybegynder
15. september 2001 - 12:05 #2
Jeg vil sige det sådan, at Sort\'en ikke forsvinder - men den bliver til gengæld bedre til at forudsige costs (der er 3 poster i tabellen):

CREATE INDEX \"tabel_idx\" ON \"tabel\" USING BTREE (\"tal\");

explain SELECT tal FROM tabel GROUP BY tal;

Group  (cost=1.05..1.06 rows=1 width=8)
  ->  Sort  (cost=1.05..1.05 rows=3 width=8)
        ->  Seq Scan on tabel  (cost=0.00..1.03 rows=3 width=8)

Om det ændrer noget på performance er svært at sige - gør jeg noget forkert?
Avatar billede coderdk Praktikant
16. september 2001 - 13:06 #3
Nææh du laver såmænd ikke noget galt, dette er hvad jeg får:

create table tabel (id int8 not null, tal int8 not null);
insert into tabel (id,tal) values (1,3);
insert into tabel (id,tal) values (2,2);
insert into tabel (id,tal) values (3,1);
create index tabel_idx ON tabel (tal);
explain select tal from tabel group by tal;
NOTICE:  QUERY PLAN:

Group  (cost=69.83..72.33 rows=100 width=8)
  ->  Sort  (cost=69.83..69.83 rows=1000 width=8)
        ->  Seq Scan on tabel  (cost=0.00..20.00 rows=1000 width=8)

Læg mærke til at indexet først blev lavet efter der var sat data ind...
Se nu her:


drop index tabel_idx;
drop table tabel;
create table tabel (id int8 not null, tal int8 not null);
create index tabel_idx ON tabel (tal);
insert into tabel (id,tal) values (1,3);
insert into tabel (id,tal) values (2,2);
insert into tabel (id,tal) values (3,1);
explain select tal from tabel group by tal;
NOTICE:  QUERY PLAN:

Group  (cost=0.00..61.50 rows=100 width=8)
  ->  Index Scan using tabel_idx on tabel  (cost=0.00..59.00 rows=1000 width=8)

EXPLAIN

Nu udnyttes indexet som det skal... Det lader til at indexet ikke bliver
bygget når det først bliver lavet efter data er sat ind...
Selv med REINDEX TABLE og/eller REINDEX INDEX får man ikke det ønskede
resultat... Underligt. Du kan dumpe indholdet, droppe tabellen og indexet og
lave dem igen og derefter sætte data ind.


=)
Avatar billede coderdk Praktikant
16. september 2001 - 13:08 #4
Måske er dit nuværende resultat (selvom der er sort og seq scan) ok? Indexet ser da ud til at hjælpe af en eller anden årsag...
Avatar billede lundsfryd Nybegynder
16. september 2001 - 14:42 #5
Yeah :) Nu virker det - det nuværende løsning med sort + seq scan er ikke hurtig nok; men det er så også pt. svært at sige, om det \"nye\" resultat er mærkbart bedre, da jeg ikke har testet det med store datamængder endnu. Men umiddelbart er der jo en noget mere effektiv query plan, så jeg vil tro, at det har en effekt.

I øvrigt er det jo desværre ikke specielt smart, at den ikke kan finde ud af at indexere korrekt, når indexet laves efter at data er lagt ind - men det er til at leve med.

Du får tak for hjælpen :)
Avatar billede coderdk Praktikant
16. september 2001 - 17:14 #6
Glad for at kunne hjælpe :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester