Avatar billede ASOSOL Nybegynder
21. december 2009 - 13:09 Der er 4 kommentarer

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



hjælppp please... den trækker virkelig tænder ud!
Avatar billede 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
Avatar billede ASOSOL Nybegynder
21. december 2009 - 15:26 #2
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.
Avatar billede 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.
Avatar billede janus_007 Nybegynder
22. december 2009 - 00:31 #4
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?
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