sybase: problem s order by ... DESC
Karel Zak
zakkr na zf.jcu.cz
Pátek Listopad 24 08:48:19 CET 2000
On Thu, 23 Nov 2000, Jan Serak wrote:
> Pavel Kolesnikov wrote:
> >
> > Dobry den,
> >
> > prihodil se mi nasledujici problem:
> >
> > Mam aplikaci, ktera nad nemalou tabulkou casto provadi dotazy typu:
> >
> > SELECT * from TABLE WHERE b_id = xxx ORDER BY posted DESC
> >
> > (b_id i posted jsou indexovany, posted obsahuje datetime, kdy byl
> > dany zaznam vlozen do databaze).
> >
> > Tyto dotazy obcas trvaji velmi velmi dlouho, a zjevne je to tim,
> > ze se nepouziva index nad "posted" - showplan mi totiz tvrdi, ze
> > nejprve dochazi k insertu do worktable, a az pote k selectu,
> > narozdil od trideni "ASC", kde ukazuje, ze se rovnou vybira.
>
> a) pokud mate index nad b_id a jiny index nad posted, tak vzdy
> pro pristup do tabulky lze pouzit nejvyse jeden jediny index.
>
> b) index se pouziva pro pristup k datum, tj. pri omezeni vyberu
> podminkou ve where. Order by znamena, ze vybrana data (tj. data,
> ktera se pripadnym pouzitim indexu vybrala z databaze) se maji
> jeste pred predanim tazateli nejakym zpusobem setridit.
Vnitrne souhlasim, ze tezko pouzit index na ORDER BY pokud
tato clausule znamena "setridit vysledek". Ale pokud se nad tim
trosku vice zamyslite tak zjistite, ze ten index pouzitelny (*nekdy*)
je (vychazim z explainu PostgreSQL 7.1 - jinde to muze byt jine):
'id' je PRIMARY KEY
1/ SELECT * FROM tab ORDER BY id;
- todle je celkem logicke, pokud k datum budete pristupovat
via index tak budete radky dostavat v poradi ktere vyhovi
ORDER BY
2/ SELECT * FROM tab ORDER BY id DESC;
- todle je lahudka, nevim jak ostatni SQL, ale PostgreSQL
ma "Index Scan Backward" :-)
3/ SELECT * FROM tab WHERE id < 10 AND id > 100 ORDER BY id;
- v pripade pouziti 'id' uvnitr WHERE a zaroven v ORDER BY je
index pouzit - coz je celkem jasne.
4/ SELECT * FROM tab WHERE data LIKE 'a%' ORDER BY id;
- 'data' je *neindexovano*. Zde nastupuje presne to co se ocekava
zadny index neni pouzit pochopitelne ani na ORDER BY.
- toto plati i pokud je sloupec uvnitr WHERE naindexovan.
Proste pokud WHERE a ORDER nejsou to same tak na ORDER pouzit
index neni.
6/ SELECT * FROM tab ORDER BY x DESC, id DESC;
- toto pouzije index pokud se jedna o index z *obou* sloupcu.
Kazdopadne odpoved (Jan Seraka) k puvodnimu dotazu je naprosto OK :-)
ORDER BY, LIMIT, OFFSET apod. zachazi s vysledkem dotazu.
Karel
Další informace o konferenci Test