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!

Recommended Posts

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 to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...