23. december 2006 - 20:17Der er
3 kommentarer og 1 løsning
Hvordan anvendes SP i en query /et View
Efter migrering fra Access til MS SQL 2005 har jeg brug for at speede hastigheden op på mine søgninger:
Jeg har en forespørgsel som giver 'arbejdsdage/perioder' for hver frisør. For at angive om der ledige tider ud for hver periode laver jeg to opslag counts (hvor mange tider i den pågældende periodetype og hvor mange er så taget) - det giver en del unødig trafik. Jeg kunne nok lægge dem ned i to views og derefter linke til mit første view, men jeg tænke, det var på tide, at jeg kaster mig ud i at lave SPer og vil gerne have staldtips til hvordan de ser ud, så jeg kan komme hurtigere videre.
Hovedviewet ser sådan ud:
SELECT TOP 100 PERCENT dbo.Frisoer.FrisoerName, dbo.Frisoer.FrisoerPhone, dbo.BookingDate.FrisoerID, dbo.BookingDate.BookingDateID, dbo.BookingDate.BookingDateCompanyID, dbo.BookingDate.BookingDateDate, dbo.BookingDate.BTType, dbo.BookingDate.noview FROM dbo.BookingDate INNER JOIN dbo.Frisoer ON dbo.BookingDate.FrisoerID = dbo.Frisoer.FrisoerID WHERE (CONVERT(CHAR(8), dbo.BookingDate.BookingDateDate, 112) >= CONVERT(CHAR(8), GETDATE(), 112)) AND (dbo.BookingDate.BookingDateCompanyID = 19) AND (dbo.BookingDate.noview = 0) ORDER BY dbo.BookingDate.BookingDateDate
og de to count opslag ser henholdsvis sådan ud:
SELECT Count(*) As NumberOfTimes FROM dbo.BookingTime where (dbo.BookingTime.BTType= dbo.BookingDate.BTType )
SELECT Count(*) As BookedTimes FROM dbo.Booking WHERE (dbo.BookingBookingDateID =dbo.BookingDate.BookingDateID)
NumberOfTimes og BookedTimes skulle så gerne med i den øverste query.
Hvem kan give lidt starthjælp på denne julle effektivisering ?
Er SP det mest effektive eller skal jeg inkludere de sidste som views ?
Du kan måske gøre noget i denne stil : SELECT TOP 100 PERCENT COUNT( CASE dbo.BookingTime.BTType WHEN NULL THEN NULL ELSE 1 END), COUNT( CASE dbo.Booking.BookingDateID WHEN NULL THEN NULL ELSE 1 END), dbo.Frisoer.FrisoerName, dbo.Frisoer.FrisoerPhone, dbo.BookingDate.FrisoerID, dbo.BookingDate.BookingDateID, dbo.BookingDate.BookingDateCompanyID, dbo.BookingDate.BookingDateDate, dbo.BookingDate.BTType, dbo.BookingDate.noview FROM dbo.BookingDate INNER JOIN dbo.Frisoer ON dbo.BookingDate.FrisoerID = dbo.Frisoer.FrisoerID LEFT JOIN dbo.BookingTime ON dbo.BookingTime.BTType= dbo.BookingDate.BTType LEFT JOIN dbo.Booking ON dbo.Booking.BookingDateID =dbo.BookingDate.BookingDateID WHERE (CONVERT(CHAR(8), dbo.BookingDate.BookingDateDate, 112) >= CONVERT(CHAR(8), GETDATE(), 112)) AND (dbo.BookingDate.BookingDateCompanyID = 19) AND (dbo.BookingDate.noview = 0) ORDER BY dbo.BookingDate.BookingDateDate GROUP BY dbo.Frisoer.FrisoerName, dbo.Frisoer.FrisoerPhone, dbo.BookingDate.FrisoerID, dbo.BookingDate.BookingDateID, dbo.BookingDate.BookingDateCompanyID, dbo.BookingDate.BookingDateDate, dbo.BookingDate.BTType, dbo.BookingDate.noview
Du skal formodentligt lave count på andre felter end de 2 jeg valgte. Der er formodentlig id felter eller lignende som er mere egnet. Grunden til at jeg har valgt en left join i stedet for en inner join er at alle felter i bookingdate som ikke lige matcher noget i de 2 andre tabeller på den måde vil ryge ud.
At bruge joins er mere effektivt end at lave sub selects.
hehe det er godt :) Du kan godt lave det jeg har lavet til et view. Fordelen er at det er nemt at genbruge, et avanceret view kan godt blive meget tungt. Derfor skal man kun hente de felter ud som man har brug for.
En ms sql database er bygget til at lave joins. Det er nogen gange mere besværgeligt men kan godt betale sig i længden.. God jul :)
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.