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