Indexy v PostgreSQL
Martin Kavalec
xkavm04 na vse.cz
Pátek Září 29 00:35:55 CEST 2000
Zdravím,
narazil jsem na zajímavou vec v postgresu (7.0): mám tabulku,
zachycující stromovou strukturu:
| ctc002=> \d nodes
| Table "nodes"
| Attribute | Type | Modifier
| -----------+---------+------------------------------------------------
| id | integer | not null default nextval('nodes_id_seq'::text)
| father | integer |
| type | integer |
| alias | text |
| Indices: nodes_alias_key,
| nodes_pkey
(nodes_pkey je unique btree na id)
Zkusím tohle:
| ctc002=> explain select * from nodes where id=12;
| NOTICE: QUERY PLAN:
|
| Index Scan using nodes_pkey on nodes (cost=0.00..8.14 rows=10 width=4)
proč je výsledkem index scanu 10 řádků?
Vzpomenu si, že se typicky vyhledává s podmínkou na fathera, takže
| ctc002=> create index nodes_father on nodes(father);
Zkusím ten samý explain znova:
| ctc002=> explain select * from nodes where id=12;
| NOTICE: QUERY PLAN:
|
| Seq Scan on nodes (cost=0.00..1.48 rows=1 width=4)
Najednou se místo index scanu použije seq scan a očekává se, že
bude mnohem levnější. Čím to, že vytvořením indexu na jiném poli
se změní plán vyhodnocení dotazu? Navíc, tento plán zvítězí,
i když index nodes_father zruším.
Z praktického hlediska je mi to zatím jedno, není tam tolik tolik
dat... Spíše mě vadí, že si toto chování nedokážu vysvětlit :-)
zdraví
martin
Další informace o konferenci Databases