14. september 2001 - 14:56Der 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 :)
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.
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.
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.