index
Pavel Stehule
stehule na kix.fsv.cvut.cz
Pondělí Červenec 19 18:36:52 CEST 2004
Zdravicko vespolek,
Rozhodne PostgreSQL nutne nemusi pouzit kazdy index. Rozhoduje se na
zaklade statistik a selektivity indexu. Nekdy je levnejsi sekvencni
pristup. Nicmene statistiky obcas (ve vyjmecnych pripadech nestaci) a pak
je dobre zkusit zpodrobnit statistiku nebo prinutit PostgreSQL pouzivat
indexy a presvedcit se, zda-li je optimalizator trouba nebo ja :-). Ne
vsechno zafunguje. Rozhodne nemam bohatou praxi a prisel jsem na par sql
dotazu, ktere bylo treba prepsat nebo pred vacuum analyze byli rychlejsi.
hledejte set enable_seqscan to off;
viz: http://www.gtsm.com/oscon2003/toc.html
http://postgresql.ok.cz/cs01.html
p.s. S triggrama to rozhodne nesouvisi
Pavel
On Mon, 19 Jul 2004, Michal Hlavac wrote:
> zdravim,
> narazil som na zaujimavy problem v postgresql...
>
> mam tabulku z tromi (vsetky integer) atributmi l_model_to_part
> (i_model_id, i_part_id, i_year)
>
> zlozeny primarny kluc sa sklada zo vsetkych troch atributov.
> potom existuju indexy:
> index_20 BTREE (i_part_id)
> index_50 BTREE (i_model_id)
>
> ked napisem:
> EXPLAIN SELECT * FROM l_model_to_part WHERE i_part_id=234;
>
> QUERY PLAN
> ----------------------------------------------------------------------------------
> Index Scan using index_20 on l_model_to_part (cost=0.00..3.37 rows=10
> width=12)
> Index Cond: (i_part_id = 234)
>
> *v pohode pouzije index_20*
>
> dalej:
> EXPLAIN SELECT * FROM l_model_to_part WHERE i_model_id=234;
> QUERY PLAN
> ---------------------------------------------------------------------
> Seq Scan on l_model_to_part (cost=0.00..1400.59 rows=866 width=12)
> Filter: (i_model_id = 234)
>
> *nepouzije index_50*
>
> but, when I use: EXPLAIN SELECT * FROM l_model_to_part WHERE
> i_model_id=234 AND i_model_id=456;
> QUERY PLAN
> -----------------------------------------------------------------------------------
> Index Scan using index_50 on l_model_to_part (cost=0.00..41.84
> rows=11 width=12)
> Index Cond: ((i_model_id = 234) AND (i_model_id = 456))
>
> *pouzije index_50*
>
>
> otazka znie, preco v druhom selekte nepouzije index_50. Su nejake
> obmedzenia na pouzitie indexu (napr. existencia triggeru, alebo nieco
> ine)???
>
> Na zaklade coho sa postgresql rozhoduje, ci index pouzije alebo nie.
> Pretoze toto sa mi zda ucebnicovy priklad na pouzitie indexu.
>
> Pretoze ako tato tabulka nie je sucastou projektu (dam hu do cistej db),
> tak aj druhy selekt pouzije index_50
>
> vdaka, miso
>
>
Další informace o konferenci Databases