sybase: problem s order by ... DESC

Jan Serak sherry na pikebo.cz
Čtvrtek Listopad 23 22:28:23 CET 2000


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.

> 
> Opravdu je tomu u dotazu s "ORDER BY ... DESC" tak?

Neznam sybase, ale principialne se vzdy selecty s order by musi
provadet tak, ze se data vyberou a pak setridi. Jestli se pred
tridenim ulozi nekam do docasnych struktur v databazi nebo
nekam do pameti je vcelku lhostejne.

Uprimne receno nedokazu si predstavit, jak by sybase dokazala
indexu vyuzit pri trideni vybrane podmnoziny zaznamu a jeste
k tomu se omezovala jen na jeden "smer" usporadani. Kupr. Oracle
to uklada do docasnych bloku pred tridenim vzdy, bez ohledu na to,
zda je pozadovano trideni sestupne nebo vzestupne (navic to lze
kombinovat: order by sloupec1 asc,sloupec2 desc).

> 
> Pokud ano, jak tento problem resit?

Pri pouziti order by je nutne vzdy pocitat s jistou rezii na
zaverecne trideni vybranych dat, ktere ma slozitost (pokud
se nepletu) n.log(n). Podle toho je treba se zaridit na urovni
aplikace.

> 
> Neprilis ciste metody, ktere me napadaji, jsou treba "odhadnout",
> ze zaznamy, ktere me zajimaji, nejsou starsi nez xyz hodin, a tim
> zmensit tridenou mnozinu.

Nevim, co je necisteho na:

	select ... from ... where b_id=xyz and posted>sysdate-3

pokud me nezajimaji data starsi tri dnu (omlouvam se, sysdate-3
lze pravdepodobne pouzit pouze v Oracle). Pokud jsou v tabulce
data za posledni rok, muze to samozrejme VELMI pomoci.

Ohledne indexovani offsetu od pulnoci 1. 1. 3000: neverim, ze by Vam
to mohlo nejak vyrazne pomoci. Tridit se musi tak jako tak.


						Jan Serak


Další informace o konferenci Databases