Hallo,
ich habe ein Stored Procedure, welche folgende Aufgaben erledigt:
1. Durchlaufen einer Stammdatentabelle mittels Cursor und weitergabe der jeweiligen Teilenummer
2. Die CTE (stl) durchläuft eine mehrstufige Stückliste und ermittelt dabei die maximale Beschaffzeit (be_zeit) eines Teiles für die jeweilige Stufe
3. Die ermittelten Daten der CTE (stl) werden in einer Tabelle abgespeichert. Hierbei ermittelt die Case-Abfrage noch,ob es sich beim jeweiligen Teil um einen Knoten für die nächste Stufe handelt
Das alles funktioniert wunderbar, nur es dauert zu lange (viel zu lange). Für ca. 44.000 eingefügte Datensätze benötigt es ca. 2h25min.
Hier nun meine Stored Procedure
Hat jemand eine, oder auch mehrere Ideen, wie man das Ganze performanter gestalten kann.
Die drei Ausgangstabellen besitzen alle einen PK und mehrere Indizes.
Gruß
Gerald
ich habe ein Stored Procedure, welche folgende Aufgaben erledigt:
1. Durchlaufen einer Stammdatentabelle mittels Cursor und weitergabe der jeweiligen Teilenummer
2. Die CTE (stl) durchläuft eine mehrstufige Stückliste und ermittelt dabei die maximale Beschaffzeit (be_zeit) eines Teiles für die jeweilige Stufe
3. Die ermittelten Daten der CTE (stl) werden in einer Tabelle abgespeichert. Hierbei ermittelt die Case-Abfrage noch,ob es sich beim jeweiligen Teil um einen Knoten für die nächste Stufe handelt
Das alles funktioniert wunderbar, nur es dauert zu lange (viel zu lange). Für ca. 44.000 eingefügte Datensätze benötigt es ca. 2h25min.
Hier nun meine Stored Procedure
Code:
Declare @BAUKASTENNR nvarchar(12); declare cur cursor for SELECT Distinct TEILENR FROM TA_TEILE open cur fetch next from cur into @BAUKASTENNR while @@fetch_status = 0 BEGIN with stl as (Select cast(TEILENR as nvarchar(12)) as BG, cast(TEILENR as nvarchar(12)) as baukastennr, cast(TEILENR as nvarchar(12)) as einzelteilnr, cast((BE_ZEIT_1 + BE_ZEIT_2) as numeric(5,0)) as beschaffzeit, cast(BE_ZEIT_1 as numeric(5,0)) as BZ_1, cast(BE_ZEIT_2 as numeric(5,0)) as BZ_2, cast(BE_ZEIT_3 as numeric(5,0)) as BZ_3, 0 as level from TA_DISPO where TEILENR = @BAUKASTENNR union all select @BAUKASTENNR as BG ,A.baukastennr ,A.einzelteilnr ,cast(max(B.BE_ZEIT_1 + B.BE_ZEIT_2) over (PARTITION by A.BAUKASTENNR) as numeric(5,0)) AS be_zeit ,cast(B.BE_ZEIT_1 as numeric(5,0)) as BZ_1 ,cast(B.BE_ZEIT_2 as numeric(5,0)) as BZ_2 ,cast(B.BE_ZEIT_3 as numeric(5,0)) as BZ_3 ,level +1 from TA_STÜCKLISTE as A INNER JOIN TA_DISPO as B ON A.EINZELTEILNR = B.TEILENR inner join stl parts on A.baukastennr = parts.einzelteilnr ) Insert into [dbo].[TA_Stückl_Be_zeit] (BG, baukastennr, einzelteilnr, bes_zeit, BZ_1, BZ_2, BZ_3, [level], IsNode) Select BG, baukastennr, einzelteilnr, be_zeit, BZ_1, BZ_2, BZ_3, [level], case when ( (stl.einzelteilnr in (select top(1) baukastennr from TA_STÜCKLISTE where baukastennr = stl.einzelteilnr)) ) then 1 else 0 end from stl fetch next from cur into @BAUKASTENNR END close cur deallocate cur
Die drei Ausgangstabellen besitzen alle einen PK und mehrere Indizes.
Gruß
Gerald
Comment