13. januar 2003 - 09:57Der 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 )
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?
>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).
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.
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
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!!).
Jeg blev nødt til at opdele mine mødelokaler for at få ventetiden ned.
Synes godt om
Ny brugerNybegynder
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.