Indexovani - teorie

Honza Pazdziora adelton na informatics.muni.cz
Středa Říjen 16 14:34:11 CEST 2002


On Wed, Oct 16, 2002 at 02:25:22PM +0200, Karel Zak wrote:
> On Wed, Oct 16, 2002 at 12:44:49PM +0200, Honza Pazdziora wrote:
> 
> > Operator OR je zcela opacna situace. Protoze to, ze mate index nad
> > (sl1, sl2) Vam vyhledani vsech zaznamu, kde se sl1 = 'xxx' nijak
> > neurychli. Zato ale pote, co server nasel vsechny zaznamy, kde sl1
> > = 'xxx', musi (pokud nad sl2 nebude index) projit jeste jednou celou
> > tabulku a zjistit, kdeze se sl2 = 'yyy'. Cili vysledkem pravdepodobne
> 
>  Todle neni uplne presne. Nerekl bych, ze musi projit jeste jednou
>  celou tabulku, ale porovnani vsech polozek dane tabulky, ktere jsou 
>  obsazene ve WHERE se provadi pri jednom pruchodu.

Jasne, to jsem psal pak dole, ze je velmi pravdepodobne, ze se index
vubec nepouzije a ten optimizer se rozhodne pro neco, co se v Oraclu
nazyva full table access a v PostgreSQL asi seq scan.

> Podobne je to pokud neexistuje spolecny index. K tabulce se pristupuje 
> pomoci indexu a data v tabulce se dale filtruji podle polozek v indexu 
> neobsazenych. Mam mocit, ze zde zaznelo, ze pokud jsou indexy na obe 
> polozky dotazu tak je to stejne jako jejich spolecny index. To je 
> pochopitelne hloupost. Pouzije se jen jeden index a na dalsi cast 
> se pouzije "filtrovani" -- pokud by se pouzilo vice indexu tak by se 
> pak muselo delat nejake filtrovani/merge mezi vysledky z jednotlivych indexu
> (coz se deje pri pouziti napr. subselectu nebo nejakych joinu). Viz:

Nevim, jestli narazite na to, co jsem psal ja, ale neni obecne pravda,
ze pokud mate podminku sloupec1 = hodnota1 and sloupec 2 = hodnota2
a jeden index na sloupci sloupec1 a druhy index na sloupci sloupec2,
tak ze se pouzije pouze jeden z tech indexu a nad takto ziskanymi
polozkami se pak ta druha podminka vyhodnoti podle zaznamu v radcich
tabulky. Optimizer muze vedet, ze pristup do radku tabulky je vyrazne
pomalejsi nez si udelat jeden seznam id zaznamu pro prvni podminku
podle prvniho indexu, seznam id zaznamu pro druhou podminku podle
druheho zaznamu, a pak to proste sloucit pomoci hash/merge/sort/cokoli
join. Ono se totiz muze stat, ze udelat tohle a vyhodnotit dva seznamy
na zaklade indexu (pouze) bude vyrazne rychlejsi a tudiz z pohledu
optimizeru levnejsi nez porovnavani hodnot v tabulce na zaklade
jednoho seznamu. Hmmm. Bavime-li se tedy v rovine "Indexovani -
teorie" -- je mozne, ze konkretne tohle PostgreSQL neumi.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
      ... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------


Další informace o konferenci Test