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 Databases