Jump to content

Probleme mit der Performance von Stored Procedures


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich habe ein Riesenproblem mit der Performance von Stored Procs's auf dem MS SQL Server (2014). Wenn ich einen bestimmtes Code-Fragment in eine Stored Proc packe, wird der Code extrem langsam bzw. führt das sogar zu einem Timeout. Führe ich denselben Code im Management-Studio als Abfrage aus, läuft der Code einwandfrei. Wer kann mir unter Umständen mal Tipps geben, wo ich da anfangen soll zu suchen? Ich bin für jeden Hinweis dankbar.

 

Gruß Andre

 

Zur Info der Quelltext:

Proc-Erstellung

create procedure [dbo].[sP_Inventurdruck_Bewertung]

@BelegNr varchar(15) = Null,

@Gruppierung tinyint, -- 1 = Artikelgruppe 1. Stufe; 2 = Artikelgruppe 2. Stufe; 3 = Artikelgruppe 3. Stufe

@ArtikelgruppenFilter int = -1,

@nurSummen int = 0

as

 

Den Kopf habe ich dann in der Abfrage geändert und die Parameter einfach mit Demo-Werten gefüllt.

 

declare @BelegNr varchar(15)

declare @Gruppierung tinyint

declare @ArtikelgruppenFilter int

declare @nurSummen int

set @BelegNr = '000322'

set @Gruppierung = 1

set @ArtikelgruppenFilter = -1

set @nurSummen = 0

/*

drop table ##tempArtikelGruppenStufen

drop table ##tempArtgruppHier

*/

create table ##tempArtikelGruppenStufen

(

Artikelgruppe int,

Stufe1 int,

Stufe2 int,

Stufe3 int

)

 

create table ##tempArtgruppHier (

Zaehler int,

Artikelgruppe int)

declare @Stufe1 int

declare @Stufe2 int

declare @Stufe3 int

declare @Artikelgruppe int

declare @SourceArtikelgruppe int

declare @Zaehler int

 

declare myCursor Cursor for

select ArtikelgruppeNr from dbo.Artikelgruppen

-- where (Artikelnummer like '0.%')

for read only

open myCursor

while (0 = 0) begin

Fetch Next from myCursor into @Artikelgruppe

if (@@Fetch_Status <> 0) break

 

set @SourceArtikelgruppe = @Artikelgruppe

delete from ##tempArtgruppHier

 

if (@Artikelgruppe is null)

break

 

set @Zaehler = 1

 

insert into ##tempArtgruppHier

(Zaehler,Artikelgruppe)

Values

(@Zaehler,@Artikelgruppe)

 

set @Artikelgruppe =

(select VorgaengerArtikelgruppe from dbo.Artikelgruppen

where (Artikelgruppen.ArtikelgruppeNr = @Artikelgruppe))

while (@Artikelgruppe is not null) and (@Artikelgruppe <> -1) begin

set @Zaehler = @Zaehler + 1

insert into ##tempArtgruppHier

(Zaehler,Artikelgruppe)

Values

(@Zaehler,@Artikelgruppe)

set @Artikelgruppe =

(select VorgaengerArtikelgruppe from dbo.Artikelgruppen

where (Artikelgruppen.ArtikelgruppeNr = @Artikelgruppe))

end

set @Stufe1 = (select Artikelgruppe from ##tempArtgruppHier

where (Zaehler = @Zaehler))

set @Stufe2 = (select Artikelgruppe from ##tempArtgruppHier

where (Zaehler = @Zaehler-1))

set @Stufe3 = (select Artikelgruppe from ##tempArtgruppHier

where (Zaehler = @Zaehler-2))

insert into ##tempArtikelGruppenStufen

(Artikelgruppe,Stufe1,Stufe2,Stufe3)

Values

(@SourceArtikelgruppe,@Stufe1,@Stufe2,@Stufe3)

end

close myCursor

Deallocate myCursor

 

 

 

 

select

@nurSummen as nurSummen,

@Gruppierung as Gruppierung,

Pos.BelegNr,Pos.Pos_Nr,

Artgrupp.Stufe1,

Stufe1Tab.Bezeichnung as ArtgruppStufe1,

Artgrupp.Stufe2,

Stufe2Tab.Bezeichnung as ArtgruppStufe2,

Artgrupp.Stufe3,

Stufe3Tab.Bezeichnung as ArtgruppStufe3,

Pos.Artikelnummer,Pos.Charge,

Stamm.Bezeichnung,Stamm.Langtext,Stamm.Laenge,Stamm.Breite,

ME2.Bezeichnung as Laenge_ME,

ME3.Bezeichnung as Breite_ME,

Pos.Menge,ME.Bezeichnung as Menge_ME,

Pos.Calc__Menge_in_PreisME,

Kopf.Bezeichnung as BelegBezeichnung,

Kopf.Beleg_Datum,

Pos.Preis, ME1.Bezeichnung as Preis_je,Waehr.KurzBez as Waehrung,

Summ.PosWert,

GesSumme.PosWert as GesamtWert,

Pos.Sollmenge_in_MELAGER,

dbo.Func_ME_Umrechnung

(Pos.Menge,Pos.Menge_ME,Stamm.MELAGER,

Pos.Calc__Laenge_inUmrME,Pos.Calc__Breite_inUmrME,0,0,Pos.Calc__Staerke_inUmrME,

Pos.Calc__Stueckjepak_inUmrME,Pos.Calc__PakproPalette_inUmrME,Pos.Calc__Gewicht_inUmrME,0,0,0,0,0,0,0)

as Menge_in_MELAGER,

Pos.Sollmenge_in_MELAGER-dbo.Func_ME_Umrechnung

(Pos.Menge,Pos.Menge_ME,Stamm.MELAGER,

Pos.Calc__Laenge_inUmrME,Pos.Calc__Breite_inUmrME,0,0,Pos.Calc__Staerke_inUmrME,

Pos.Calc__Stueckjepak_inUmrME,Pos.Calc__PakproPalette_inUmrME,Pos.Calc__Gewicht_inUmrME,0,0,0,0,0,0,0)

as Differenz,

ME4.Bezeichnung as MELAGERBezeichnung

from dbo.Belegpositionen Pos left outer join dbo.Artikelstamm Stamm

on Pos.Artikelnummer = Stamm.Artikelnummer

inner join dbo.Belegkopf Kopf

on Pos.BelegNr = Kopf.BelegNr

left outer join dbo.Mengeneinheiten ME

on Pos.Menge_ME = ME.ME

left outer join dbo.Mengeneinheiten ME1

on Pos.Preis_ME = ME1.ME

left outer join dbo.Mengeneinheiten ME2

on Stamm.Laenge_ME = ME2.ME

left outer join dbo.Mengeneinheiten ME3

on Stamm.Breite_ME = ME3.ME

left outer join dbo.Mengeneinheiten ME4

on Stamm.MELAGER = ME4.ME

left outer join dbo.V_Belegsummen1 Summ

on (Pos.BelegNr = Summ.Belegnr) and (Pos.Pos_Nr = Summ.Pos_Nr)

left outer join dbo.Waehrungen Waehr

on (Pos.Waehrung = Waehr.WaehrungsNr)

left outer join dbo.V_Belegsummen2 GesSumme

on Pos.BelegNr = GesSumme.BelegNr

left outer join ##tempArtikelGruppenStufen Artgrupp

on Artgrupp.Artikelgruppe = Stamm.Artikelgruppe

left outer join dbo.Artikelgruppen Stufe1Tab

on Artgrupp.Stufe1 = Stufe1Tab.ArtikelgruppeNr

left outer join dbo.Artikelgruppen Stufe2Tab

on Artgrupp.Stufe2 = Stufe2Tab.ArtikelgruppeNr

left outer join dbo.Artikelgruppen Stufe3Tab

on Artgrupp.Stufe3 = Stufe3Tab.ArtikelgruppeNr

where ((Pos.BelegNr = @BelegNr) and ((Pos.Menge <> 0) or (Pos.Sollmenge_in_MELAGER <> 0)))

and

( (@ArtikelgruppenFilter = -1) or

(Stamm.Artikelnummer in

(select Artikelnummer from dbo.Artikelgruppenzuordnung

where (Artikelgruppe = @ArtikelgruppenFilter ))

)

)

order by

case

when @Gruppierung = 1

then

right(coalesce('0000000000'+cast(Artgrupp.Stufe1 as varchar(10)),'0000000000'),10)+

';;'+Stamm.Artikelnummer

when @Gruppierung = 2

then

right(coalesce('0000000000'+cast(Artgrupp.Stufe1 as varchar(10)),'0000000000'),10)+';;'+

right(coalesce('0000000000'+cast(Artgrupp.Stufe2 as varchar(10)),'0000000000'),10)+';;'+

Stamm.Artikelnummer

when @Gruppierung = 3

then

right(coalesce('0000000000'+cast(Artgrupp.Stufe1 as varchar(10)),'0000000000'),10)+';;'+

right(coalesce('0000000000'+cast(Artgrupp.Stufe2 as varchar(10)),'0000000000'),10)+';;'+

right(coalesce('0000000000'+cast(Artgrupp.Stufe3 as varchar(10)),'0000000000'),10)+';;'+

Stamm.Artikelnummer

end

 

 

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...