On Wed, 17 Nov 2004 23:12:05 +0100, Michael Sig Birkmose wrote:
> Jeg har btree index paa ts og objectid.
Bruger du MySQL, Oracle, Access, PostgreSQL, Interbase, MS-SQL,
DB2, ...?
Der er forskellige optimeringer for de forskellige databaser.
Jeg har jævnligt været nødt til at omskrive SQL statements, som
optimizeren bare ikke fattede at optimere. Ikke fordi det var
dårlig kode, men lige præcis den situation, som jeg bragte den i
fandt den ikke nogen optimeret løsning på.
Typisk er det, at databasen af uforklarlige årsager undlader at
bruge et index (eller flere). Det kunne også være tilfældet hos
dig. Og i dette tilfælde, så kan man tit forklare databasen
nærmere om sagen, f.eks. i Oracle med optimizer hints i
kommentarer til SQL'en.
Sådan ret generelt SQL, så er EXPLAIN din rigtigt gode ven, når
det går for langsomt. Her kan du straks se om query'en vil bruge
de index'er, som du havde i tankerne, da du skrev SQL'en.
> Men men hvis jeg nu laver et query hvor jeg vil have alle
> rapporter for et given objekt inden for en dag opstaar der
> problemmer. Pseudo query: SELECT * FROM log WHERE ts > '1dag
> siden' AND objectid=et_eller_andet
Prøv at lave et compound (sammensat!? er ikke god til IT-dansk)
index på både ts og objectid felterne, med ts som første felt.
'CREATE INDEX log_tsoi ON log (ts, objectid)' er vist syntaksen.
Du skriver, at dine index'er er btree - check hvilke typer din
database ellers kan håndtere og se om nogle af dem er
passende/bedre for denne query.
> Hvis den teori holder stik, saa er mit sporgsmaal selvfoelgelig - hvordan
> kan man designe sig ud af dette?
Svært at sige - din teori med sekventialiteten er nemlig også
database-afhængigt
Men en subselect er måske hurtigere:
SELECT *
FROM (
SELECT *
FROM log
WHERE ts > '1dag siden'
)
WHERE objectid=et_eller_andet;
Her tvinger du databasen til først at select'e de rækker du ved
går hurtigt (sub-select på ts). Bagefter, så køres select'en på
objectid kun mod de rækker, som sub-select'en fandt. Det kan være
både hurtigere og langsommere - og måske er der præcist ingen
forskel overhovedet, hvis det er en rå SQL-optimizer du har dig.
Mht. designet, så start med at prøve de ting jeg nævner - måske
behøver du slet ikke røre ved det.
--
Stig - remove the 'no's to send me mail
Synchronize your bookmarks:
http://syncit.goth.dk/