Avatar billede hnteknik Novice
23. december 2006 - 20:17 Der 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 ?
Avatar billede dr_chaos Nybegynder
23. december 2006 - 22:39 #1
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.
Avatar billede hnteknik Novice
23. december 2006 - 22:47 #2
Hej dr_chaos

Smart ide igen.

Jeg lavede to views hvor jeg groupede counts og derefter joinede til start viewet.
Det ser ud til at give en rigtig god hastighed.

Men din ide er rigtig smart, da jeg undgår at lave views. På den anden side så kan det være at views exekverer lidt hurtigere.

Kast et svar - jeg bliver helt i julehumør.
Avatar billede dr_chaos Nybegynder
23. december 2006 - 22:56 #3
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 :)
Avatar billede hnteknik Novice
23. december 2006 - 23:09 #4
God Jul selv
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