Avatar billede bitbiter Nybegynder
01. maj 2006 - 11:31 Der er 1 kommentar

Opslags tid på SQL select sætning i Interbase

Hej

Jeg har et problem med sørgetiden for en SQL select sætning i Interbase. min sætning ser således ud:

SELECT REGNO, FNAME, TESTSTOP
FROM BMTEST
JOIN VEHICLE v
  ON BMTEST.GUIDVEHICLE = v.GUIDVEHICLE
LEFT JOIN CUSTOMER c
  ON BMTEST.GUIDCUSTOMER = c.GUIDCUSTOMER
JOIN INFO i
  ON BMTEST.IDXINFO = i.IDXINFO
WHERE v.REGNO = 'AB1234'
________________________________

FNAME er i tabellen CUSTOMER og TESTSTOP i tabel INFO. Problemet er at sørgetiden for denne sætning er på 2,5 sek. Hvis jeg fjerner LEFT i "LEFT JOIN CUSTOMER c" kommer min sørgetid ned på 3ms. Men da GUIDCUSTOMER godt kan være NIL er dette ikke en mulig løsning. Det lader til Interbase ikke vil bruge det index jeg har lavet på INFO tabellen når jeg bruger LEFT JOIN. Er der nogle der ved hvorfor sørgetiden bliver så meget dårligere bare fordi jeg bruger et LEFT JOIN og hvad men evt. kan gøre ved det.

PLAN sætning med LEFT JOIN:
PLAN MERGE (SORT (I NATURAL),SORT (JOIN (JOIN (V INDEX (REGVEH_INX),B INDEX (INFOVEH_INX)),C INDEX (RDB$PRIMARY2))))

PLAN sætning uden LEFT JOIN:
PLAN JOIN (V INDEX (REGVEH_INX),B INDEX (INFOVEH_INX),I INDEX (RDB$PRIMARY4),C INDEX (RDB$PRIMARY2))
Avatar billede kjulius Novice
01. maj 2006 - 21:28 #1
Jeg skal ikke gøre mig klog på Interbase, da jeg ikke kender den, men når jeg ser på din SQL sætning, er der en ting som slår mig.

Normalt bør man så vidt muligt placere en LEFT OUTER JOIN efter INNER JOINs, med mindre man . Medmindre databasemotoren tager højde for det i den execution plan den udarbejder, kan det gøre programmet en del langsommere, ikke at overholde den regel. Som sagt kender jeg intet til Interbase, så måske kan den allerede optimere for rækkefølgen, men hvis ikke...

Jeg ville prøve at flytte din LEFT JOIN ned til sidst:

SELECT REGNO, FNAME, TESTSTOP
FROM BMTEST
JOIN VEHICLE v
  ON BMTEST.GUIDVEHICLE = v.GUIDVEHICLE
JOIN INFO i
  ON BMTEST.IDXINFO = i.IDXINFO
LEFT JOIN CUSTOMER c
  ON BMTEST.GUIDCUSTOMER = c.GUIDCUSTOMER
WHERE v.REGNO = 'AB1234'
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester