Hjælp til stored procedure, der trækker tænder i vores sql 2005 miljø. HELPP
hej alle, jeg har lige kørt en sql server profiler på vores miljø, da vi oplever dårlige svartider.
kan se en genganger på denne SP: exec spReadIndberetningInActive @CVRNr=N'118x6342x' fx. (der er naturligvis forskellige cvr numre hver gang).
cpu: ca. 20000 - reads ca. 500.000 - writes 0 - duration ca. 80000.
De svartider mener jeg er ret høje... og hver gang vi knalder denne SP process ned, så performer systemet meget bedre... men der er behov for denne sp kan køre. så kan i venligst hjælp med at kigge i denne sp, og se om der kunne være nogle forbedringer til denne.
applikationsleverandøren mener at queryen lagrer en masse i tempdb, og det var noget med vi skulle lave indexes i tempdb eller noget.. hmm...
her er koden til sp:
ALTER PROCEDURE [dbo].[spReadIndberetningInActive] ( @CVRNr nvarchar(8) ) AS
select *, cast(NULL as datetime) BidragPeriodeStart, cast(NULL as datetime) IndskudPeriodeStart, cast(NULL as datetime) BidragPeriodeSlut, cast(NULL as datetime) IndskudPeriodeSlut into #IndberetningIds from viewActiveIndberetning indb where (indb.ArbejdsgiverCVR=@CVRNr AND (indb.Status = 'ValideretOk' OR indb.Status = 'Modtaget')) order by indb.Indberettet desc
update #IndberetningIds set BidragPeriodeStart= perioder.BidragPeriodeStart, BidragPeriodeSlut= perioder.BidragPeriodeSlut, IndskudPeriodeStart= perioder.IndskudPeriodeStart, IndskudPeriodeSlut= perioder.IndskudPeriodeSlut from #IndberetningIds inner join (select IndberetningId, min(BidragStartDato) BidragPeriodeStart, max(BidragSlutDato) BidragPeriodeSlut, min(IndskudsStartDato) IndskudPeriodeStart, max(IndskudsSlutDato) IndskudPeriodeSlut from [ViewIndberetning] indb group by IndberetningId) perioder on #IndberetningIds.IndberetningId = perioder.IndberetningId
select * from #IndberetningIds order by Indberettet desc drop table #IndberetningIds
På Computerworld Cloud & AI Festival kan du møde en af landets skarpeste CISO’er; Thomas Zuliani fra Arla Foods. Få en forsmag på hans keynote her.
1. juli 2024
Slettet bruger
21. december 2009 - 14:34#1
Nu er MS SQL ikke lige min spidskompetence og heller ikke SP, men her er et forsøg. Alle feter, du skal bruge, skal tilføjes i både SELECT og GROUP BY delene:
ALTER PROCEDURE [dbo].[spReadIndberetningInActive] ( @CVRNr nvarchar(8) ) AS
SELECT [viewActiveIndberetning].[IndberetningId], min([ViewIndberetning].[BidragStartDato]) AS [BidragPeriodeStart], max([ViewIndberetning].[BidragSlutDato]) AS [BidragPeriodeSlut], min([ViewIndberetning].[IndskudsStartDato]) AS [IndskudPeriodeStart], max([ViewIndberetning].[IndskudsSlutDato]) AS [IndskudPeriodeSlut] FROM [viewActiveIndberetning] INNER JOIN [ViewIndberetning] ON ( [viewActiveIndberetning].[IndberetningId] = [ViewIndberetning].[IndberetningId] ) WHERE [viewActiveIndberetning].[ArbejdsgiverCVR] = @CVRNr AND ( [viewActiveIndberetning].[Status] = 'ValideretOk' OR [viewActiveIndberetning].[Status] = 'Modtaget' ) GROUP BY [viewActiveIndberetning].[IndberetningId] ORDER BY [viewActiveIndberetning].[Indberettet] DESC
du mener at dit oplæg skulle være en simplere måde at kode det på,, og at det skulle performe bedre?...
hvad med sådan noget som indexering... kan man sætte noget form for indexering som denne SP kan anvende... selvom den sætter lokale variabler osv.
Synes godt om
Slettet bruger
21. december 2009 - 15:38#3
Den SP, jeg har defineret, benytter ikke lokale variable, tabeller eller andet performancenedsættende. Den midlertidige tabel (#IndberetningIds) er fjernet og dermed bliver indexering udnyttet.
Applikationsleverandøren har intet begreb om at skrive SQL kan jeg da se ;) Man må håbe applicationskoden er bedre *LOL*
Anyway... som kvadratrod siger, så kan det hele formodentligt klares uden en temptable, men men... Det er ikke nødvendigvis den der tager tid og indexet skal nok udnyttes korrekt om den bruges eller ej - forudsat at der er et index (hvilket det ikke tyder på)
Når du kører denne: select *, cast(NULL as datetime) BidragPeriodeStart, cast(NULL as datetime) IndskudPeriodeStart, cast(NULL as datetime) BidragPeriodeSlut, cast(NULL as datetime) IndskudPeriodeSlut into #IndberetningIds from viewActiveIndberetning indb where (indb.ArbejdsgiverCVR=@CVRNr AND (indb.Status = 'ValideretOk' OR indb.Status = 'Modtaget')) order by indb.Indberettet desc
Og lige skifter @CVRNr ud med noget der findes, hvor mange rækker giver den så ca?
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.