Avatar billede cesil Nybegynder
13. januar 2003 - 09:57 Der er 9 kommentarer og
1 løsning

Sql hastighed

Hej Eksperter
Jeg har lavet et bookingsystem til mødelokaler. Det er lavet på den måde at for hvert tidsinterval laver systemet et lookup i databasen for at checke om tidspunktet er booket. Det virker fint nok. Der er bare det problem at der er ca. 20 mødelokaler og 36 tidsintervaller der kan bookes hver dag. Det giver allerhelvedes mange opslag og giver svartider på ca. 20 sekunder.

Jeg skal finde en måde at få svartiden alvorligt langt ned og det er her jeg håber i kan hjælpe.

Mit opslag ser således ud:

sql =     " SELECT MAX_MEETINGROOM_BOOKED.id,MAX_MEETINGROOM_BOOKED.bookedchairs, MAX_MEETINGROOM.meetingname, MAX_MEETINGROOM.chairs " & _
            " FROM MAX_MEETINGROOM_BOOKED LEFT OUTER JOIN MAX_MEETINGROOM ON MAX_MEETINGROOM.id = MAX_MEETINGROOM_BOOKED.meetingroomid " & _
            " WHERE (MAX_MEETINGROOM_BOOKED.booked<>0) AND (MAX_MEETINGROOM_BOOKED.meetingroomid=" & id & ") " & _
            " AND ('" & caldate & "' BETWEEN MAX_MEETINGROOM_BOOKED.datefrom AND MAX_MEETINGROOM_BOOKED.dateto ) "'


En response.write af min query ser således ud:

SELECT MAX_MEETINGROOM_BOOKED.id,MAX_MEETINGROOM_BOOKED.bookedchairs, MAX_MEETINGROOM.meetingname, MAX_MEETINGROOM.chairs FROM MAX_MEETINGROOM_BOOKED LEFT OUTER JOIN MAX_MEETINGROOM ON MAX_MEETINGROOM.id = MAX_MEETINGROOM_BOOKED.meetingroomid WHERE (MAX_MEETINGROOM_BOOKED.booked<>0) AND (MAX_MEETINGROOM_BOOKED.meetingroomid=2) AND ('20021121 07:00' BETWEEN MAX_MEETINGROOM_BOOKED.datefrom AND MAX_MEETINGROOM_BOOKED.dateto )
Avatar billede _darkstar_ Nybegynder
13. januar 2003 - 10:30 #1
Prøv at undgå det outer left join, du bruger.
Hvis din kode allerede har fat i id'et på det rum som skal bookes, så brug det.

Jeg synes iøvrigt at det ser mærkeligt ud hvad angår dit skema - du har en tabel ved navn MAX_MEETINGROOM, som jeg antager skal indeholde alle de rum man kan holde møde i. I denne tabel er så et felt ved navn meetingname. Det er da noget der hører til de enkelte bookings, eller er det faktisk sådan at man kun kan holde "Økonomimøde" i det rum der er indrettet til det?
Avatar billede cesil Nybegynder
13. januar 2003 - 10:39 #2
Feltet meetingname er bare navnet på mødelokalet. fx A220.
Det er ikke mærkbart hurtigere med en INNER JOIN istedet for en LEFT OUTER JOIN.
Avatar billede _darkstar_ Nybegynder
13. januar 2003 - 10:47 #3
>Feltet meetingname er bare navnet på mødelokalet. fx A220.

Okay. Det synes jeg så er et dårligt navn. Det kunne f. eks. være "name" eller "roomname", men pyt være med det.

>Det er ikke mærkbart hurtigere med en INNER JOIN istedet for en LEFT OUTER JOIN.
Det er korrekt - det bliver ikke meget hurtigere hvis man bruger en anden jointype. Du skal helt undgå at lave forespørgslen på mere end MAX_MEETINGROOM_BOOKED, hvis du kan (hvilket burde kunne lade sig gøre).
Avatar billede _darkstar_ Nybegynder
13. januar 2003 - 10:48 #4
Altså - intet join overhovedet - kun een tabel i forespørgslen - nemlig MAX_MEETINGROOM_BOOKED.
Avatar billede zeptic Nybegynder
13. januar 2003 - 10:51 #5
Du skal lave INDEX'er på din database. De præcise muligheder du har for at lave INDEX afhænger af din database.
Avatar billede _darkstar_ Nybegynder
13. januar 2003 - 10:52 #6
En anden ting som du også bør checke er, om der er oprettet de rigtige indexes på de to tabeller. Der skal som minimum være index på fremmednøglefelter (meetingroomid), men det burde også give bedre performance at sætte index på datofelterne.

Du kan undersøge om det løser problemet, så du kan slippe for at skulle klippe dit join op i to forespørgsler.
Avatar billede zeptic Nybegynder
13. januar 2003 - 11:00 #7
Hvis du vælger at sætte INDEX på datoer, så husk at de skal være CLUSTERET.
Avatar billede cesil Nybegynder
13. januar 2003 - 12:10 #8
Det kapper noget af ventetiden, med index'es. Min Join er jeg også sluppet af med, men stadig er ventetiden for lang.
Jeg bruger ms-sql database hvis det kan hjælpe
Avatar billede zeptic Nybegynder
13. januar 2003 - 12:41 #9
Er der ikke en index-wizard i mssql serveren? Sådan nogle plejer at være ret gode.

Benyt også en query-analyzer til at finde flaskehalse i dine forespørgelser. De kan godt tage lidt tid at hitte u a, men er et must når man vil se hvorledes systemet behandler ens queries (det er jo ikke sikkert den gør det som du tror!!).
Avatar billede cesil Nybegynder
23. januar 2003 - 15:50 #10
Jeg blev nødt til at opdele mine mødelokaler for at få ventetiden ned.
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
Kurser inden for grundlæggende programmering

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