SQLTeam.com | Weblogs | Forums

How to amke this code faster?


#1

Hello

i have the following code
do you know how to write it to be faster than this?

thank you

</UPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = CASE WHEN Von_Adresse IS NULL OR Von_Adresse = '' THEN Lieferanten_Nummer_Kanban ELSE Von_Adresse END;
--
BEGIN
--
DECLARE cr_VonAdresse CURSOR FOR
SELECT DISTINCT a.Von_Adresse, Fehlteil, Failure_Date
FROM AMPPU_Alle_Fehlteile a
WHERE a.Von_Adresse IS NOT NULL
And Failure_Date = @Today
--
OPEN cr_VonAdresse
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
WHILE @@FETCH_STATUS = 0
BEGIN
--
BEGIN
--
UPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = @Von_Adresse
WHERE Failure_Date = @Failure_Date
AND Fehlteil = @Fehlteil;
END
--
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
END
--
CLOSE cr_VonAdresse
DEALLOCATE cr_VonAdresse
--
ENDUPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = CASE WHEN Von_Adresse IS NULL OR Von_Adresse = '' THEN Lieferanten_Nummer_Kanban ELSE Von_Adresse END;
--
BEGIN
--
DECLARE cr_VonAdresse CURSOR FOR
SELECT DISTINCT a.Von_Adresse, Fehlteil, Failure_Date
FROM AMPPU_Alle_Fehlteile a
WHERE a.Von_Adresse IS NOT NULL
And Failure_Date = @Today
--
OPEN cr_VonAdresse
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
WHILE @@FETCH_STATUS = 0
BEGIN
--
BEGIN
--
UPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = @Von_Adresse
WHERE Failure_Date = @Failure_Date
AND Fehlteil = @Fehlteil;
END
--
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
END
--
CLOSE cr_VonAdresse
DEALLOCATE cr_VonAdresse
--
END/>


#2

the code is this
something was deleted last time:

</
UPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = CASE WHEN Von_Adresse IS NULL OR Von_Adresse = '' THEN Lieferanten_Nummer_Kanban ELSE Von_Adresse END;
--
BEGIN
--
DECLARE cr_VonAdresse CURSOR FOR
SELECT DISTINCT a.Von_Adresse, Fehlteil, Failure_Date
FROM AMPPU_Alle_Fehlteile a
WHERE a.Von_Adresse IS NOT NULL
And Failure_Date = @Today
--
OPEN cr_VonAdresse
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
WHILE @@FETCH_STATUS = 0
BEGIN
--
BEGIN
--
UPDATE AMPPU_Alle_Fehlteile
SET Von_Adresse = @Von_Adresse
WHERE Failure_Date = @Failure_Date
AND Fehlteil = @Fehlteil;
END
--
FETCH NEXT FROM cr_VonAdresse
INTO @Von_Adresse, @Fehlteil, @Failure_Date
--
END
--
CLOSE cr_VonAdresse
DEALLOCATE cr_VonAdresse
--
END
/>


#3

The first update can be rewritten to:

update AMPPU_Alle_Fehlteile
   set Von_Adresse=Lieferanten_Nummer_Kanban
 where Von_adresse is null
    or Von_adresse=''
;

This way, an update is only made, when necessary. No need to update, if the field already contains the required value (unless you have a trigger in place that does "some magic").

I don't get what you are trying to do, in the rest of the statement. Seems like you go through all records where failure:date is today, and then update von_adresse to the same value, as it already is. Is that correct?
Please explain in words, what this code is supossed to do.


#4

hello
thank you

you know first i want to do the following insert
can you help me to make it faster?

</
INSERT INTO AMPPU_Alle_Fehlteile (
SNR, Auftrag, Fehlercode, Fehlerort1, Fehlerort2, Fehlerort3, Fehlerart, Bemerkung_Eintrag,
Fehlteil, Fehlteilname, Station, QG_Bereich, CD_Subprozess, Garantiecode, Prüfer, Prüfplatz,
Zeit_Fehler_EIN, Zeit_Fehler_AUS, NA_durch, Bemerkung_Austrag, NA_d_KoSt, [4M_Analyse], Reparatur_hr,
[CAB-16], [VL-01], [BV-05], Offline_date, Offline_Jahr, Offline_Monat, Offline_Woche,
OKTOSHIP, Brand, QS_Plattform, QS_Baureihe, QS_Typ, QS_Modell, Technical_Type_Nr,
On_Line_Repair, Kit, Lieferanten, Lieferanten_Nummer, Disponent, pn_description, Lieferanten_Nummer_Kanban,
Von_Adresse, Zu_Adresse, Failure_Date)
SELECT aa.SNR, aa.Auftrag, aa.Fehlercode, aa.Fehlerort1, aa.Fehlerort2, aa.Fehlerort3, aa.Fehlerart, aa.Bemerkung_Eintrag,
aa.Fehlteil, aa.Fehlteilname, aa.Station, aa.QG_Bereich, aa.CD_Subprozess, aa.Garantiecode, aa.Prüfer, aa.Prüfplatz,
aa.Zeit_Fehler_EIN, aa.Zeit_Fehler_AUS, aa.NA_durch, aa.Bemerkung_Austrag,aa.NA_d_KoSt, aa.[4M_Analyse], ROUND(aa.Reparatur_min/60,2) AS Reparatur_hr,
aa.[CAB-16], aa.[VL-01], aa.[BV-05], LEFT(CONVERT(NVARCHAR, aa.[BV-05], 120), 10) Offline_Date, YEAR(aa.[BV-05]) Offline_Jahr,
MONTH(aa.[BV-05]) Offline_Monat, DATEPART(WW,aa.[BV-05]) Offline_Woche,
aa.OKTOSHIP, aa.Brand, aa.QS_Plattform,aa.QS_Baureihe, aa.QS_Typ, aa.QS_Modell, aa.Technical_Type_Nr,
CASE WHEN aa.Zeit_Fehler_AUS IS NULL THEN 'No'
WHEN aa.[BV-05] >= aa.Zeit_Fehler_AUS THEN 'Yes'
ELSE 'No' END On_Line_Repair,
bb.kit, cc.Lieferanten, cc.Lieferanten_Nummer, dd.Disponent, dd.pn_description, ff.Lieferanten_Nummer_Kanban, ee.Von_Adr, ee.Zu_Adr,
LEFT(CONVERT(NVARCHAR, aa.Zeit_Fehler_EIN, 120), 10) As Failure_Date
FROM AQIs.dbo.Alle_Fehlerdaten AS aa
LEFT OUTER JOIN (SELECT MIN(Kommissionier_Code) kit, Teil_Nummer
FROM MES_Prod.dbo.v_MES_Kommissionier_Parameter_Teile
GROUP BY Teil_Nummer) bb
ON aa.Fehlteil = bb.Teil_Nummer
LEFT OUTER JOIN (SELECT t.Lieferanten_Nummer Lieferanten_Nummer, l.Lieferanten_Name_1 Lieferanten, Teil_Nummer
FROM dbo.Lieferanten l
RIGHT OUTER JOIN (SELECT MIN(Lieferanten_Nummer) AS Lieferanten_Nummer, Teil_Nummer
FROM dbo.Lieferanten_Teile
WHERE (Liefer_Quote >= 50)
GROUP BY Teil_Nummer) t
ON l.Lieferanten_Nummer = t.Lieferanten_Nummer) cc
ON aa.Fehlteil = cc.Teil_Nummer
LEFT OUTER JOIN (SELECT Teil_Benennung pn_description, Disponent Disponent, Teil_Nummer
FROM dbo.Teile) dd
ON aa.Fehlteil = dd.Teil_Nummer
LEFT OUTER JOIN (SELECT DISTINCT a.Teil_Nummer,
qry_Montage_Adrssen_Von.Von_Adr,
qry_Montage_Adrssen_Zu.Zu_Adr
FROM (SELECT Teil_Nummer, MIN(Von_Adresse) AS Von_Adr, Lieferanten_Nummer_Kanban
FROM dbo.ME_Montage_Adressen
WHERE Von_Adresse <> ''
AND KZ_Änderung = 'A' --Neu Mario 26.11.2013
GROUP BY Teil_Nummer, Lieferanten_Nummer_Kanban) AS qry_Montage_Adrssen_Von
RIGHT OUTER JOIN dbo.ME_Montage_Adressen AS a
ON qry_Montage_Adrssen_Von.Teil_Nummer = a.Teil_Nummer
LEFT OUTER JOIN (SELECT Teil_Nummer, MIN(Zu_Adresse) AS Zu_Adr
FROM dbo.ME_Montage_Adressen
WHERE Zu_Adresse <> ''
AND KZ_Änderung = 'A' --Neu Mario 26.11.2013
GROUP BY Teil_Nummer) AS qry_Montage_Adrssen_Zu
ON qry_Montage_Adrssen_Zu.Teil_Nummer = a.Teil_Nummer
WHERE (a.Von_Adresse <> '') AND (a.KZ_Änderung = 'A') AND (qry_Montage_Adrssen_Von.Teil_Nummer IS NOT NULL)
OR (a.Von_Adresse = '') AND (a.KZ_Änderung = 'A') AND (qry_Montage_Adrssen_Von.Teil_Nummer IS NULL)
GROUP BY a.Teil_Nummer,
qry_Montage_Adrssen_Von.Von_Adr,
qry_Montage_Adrssen_Zu.Zu_Adr,
qry_Montage_Adrssen_Von.Lieferanten_Nummer_Kanban) ee
ON aa.Fehlteil = ee.Teil_Nummer
LEFT OUTER JOIN (SELECT DISTINCT Teil_Nummer, Lieferanten_Nummer_Kanban
FROM ME_Montage_Adressen
WHERE Lieferanten_Nummer_Kanban IS NOT NULL) ff
ON aa.Fehlteil = ff.Teil_Nummer
WHERE RIGHT(aa.Fehlercode, 1) IN ('4', '5')
AND NOT EXISTS (SELECT NULL FROM AMPPU_Alle_Fehlteile AS b
WHERE aa.Auftrag = b.Auftrag
AND aa.Fehlercode = b.Fehlercode
AND aa.Zeit_Fehler_EIN = b.Zeit_Fehler_EIN);
--AND aa.[BV-05] IS NOT NULL;
--
-- Step 2: Von Adresse

update AMPPU_Alle_Fehlteile
set Von_Adresse=Lieferanten_Nummer_Kanban
where Von_adresse is null
or Von_adresse='';

WITH cte AS (
SELECT DISTINCT a.Von_Adresse, a.Fehlteil, a.Failure_Date
FROM AMPPU_Alle_Fehlteile a
WHERE a.Von_Adresse IS NOT NULL
And Failure_Date = @Today
)
UPDATE A
SET Von_Adresse= cte.Von_Adresse
FROm AMPPU_Alle_Fehlteile A
INNER JOIN cte ON A.Failure_Date = cte.Failure_Date
AND A.Fehlteil = cte.Fehlteil;
--
--

--
--BEGIN
--	--
--	DECLARE cr_VonAdresse CURSOR FOR
--		SELECT DISTINCT a.Von_Adresse, Fehlteil, Failure_Date
--					FROM AMPPU_Alle_Fehlteile a
--					WHERE a.Von_Adresse IS NOT NULL
--						And Failure_Date = @Today
--			--
--	OPEN cr_VonAdresse
--	FETCH NEXT FROM cr_VonAdresse
--	INTO @Von_Adresse, @Fehlteil, @Failure_Date
--	--
--	WHILE @@FETCH_STATUS = 0
--	BEGIN
--	--
--	BEGIN
--	--
--		UPDATE AMPPU_Alle_Fehlteile
--			SET Von_Adresse = @Von_Adresse
--				WHERE Failure_Date = @Failure_Date
--				AND Fehlteil = @Fehlteil;
--	END
--	--
--	FETCH NEXT FROM cr_VonAdresse
--	INTO @Von_Adresse, @Fehlteil, @Failure_Date
--	--
--	END
--	--
--	CLOSE cr_VonAdresse
--	DEALLOCATE cr_VonAdresse
--	--
--END
--
--
-- Step 3: Where there is no part number specified, no root cause analysis is possible!
--
UPDATE AMPPU_Alle_Fehlteile
SET Bereich = 'unknown pn',
	Process = 'N/A',
	Root_Cause = 'N/A'
WHERE pn_description IS NULL
		--OR Fehlteil like '%[a-z]%')
	AND LEFT(CONVERT(NVARCHAR, Zeit_Fehler_EIN, 120), 10) = LEFT(CONVERT(NVARCHAR, GETDATE(), 120), 10);
--
--
-- Step 4: Make sure some information are up-to-date!
--
UPDATE AMPPU_Alle_Fehlteile
SET [BV-05] =
		(SELECT [BV-05]
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	Zeit_Fehler_AUS =
		(SELECT Zeit_Fehler_AUS
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	NA_durch =
		(SELECT NA_durch
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	Bemerkung_Austrag =
		(SELECT Bemerkung_Austrag
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	NA_d_KoSt =
		(SELECT NA_d_KoSt
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	[4M_Analyse] =
		(SELECT [4M_Analyse]
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
			
	OKTOSHIP =
		(SELECT OKTOSHIP
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),
--

	Reparatur_hr =
		(SELECT ROUND(Reparatur_min/60,2)
		FROM AQIs.dbo.Alle_Fehlerdaten
		WHERE Auftrag = AMPPU_Alle_Fehlteile.Auftrag
			AND Fehlercode = AMPPU_Alle_Fehlteile.Fehlercode
			AND Zeit_Fehler_EIN = AMPPU_Alle_Fehlteile.Zeit_Fehler_EIN),

--
 Offline_date = LEFT(CONVERT(NVARCHAR, [BV-05], 120), 10),
	Offline_Jahr= YEAR([BV-05]),
	Offline_Monat = MONTH([BV-05]),
	Offline_Woche = DATEPART(WW,[BV-05])
WHERE MONTH(Zeit_Fehler_EIN) IN (MONTH(GETDATE()),MONTH(GETDATE())-1)
	AND YEAR(Zeit_Fehler_EIN) = YEAR(GETDATE());
--
--
-- Step 5: Make sure repair information are up-to-date!
--
UPDATE AMPPU_Alle_Fehlteile
SET On_Line_Repair = CASE WHEN Zeit_Fehler_Aus IS NULL THEN 'No'
							WHEN [BV-05] >= Zeit_Fehler_Aus THEN 'Yes'
							ELSE 'No' END;

/>


#5

then the update that you told me and then some updating
but totally it takes 4:30 minutes and i want to run it faster
do you have any ideas?