Performance Problem
-
Hi zusammen ich hab ein wenig ein performance Problem, und zwar geht es hier nicht um Millisekunden sondern um mehrere Sekunden. Das Problem ist, dass auf dem Scheiss Server so bescheuerte Jobs laufen, die zu folge haben, dass meine Anfragen immer gedeadlockt werden.
vielleicht kann mir einer von euch helfen, also meine stored Procedure sieht so aus.
CREATE PROCEDURE SapMesHelper_GetActIfPerfByPeriodWithDetails ( @From datetime, @To datetime ) AS BEGIN /* Prozedur Körper */ set nocount on /*declare a tempoary Table to store the results of the single days*/ CREATE TABLE #ActIfPerfByPeriod( [Messagetype] varchar(50), [start] datetime null, [ende] datetime null, [ok] int null, [initerror] int null, [remainingerrors] int null, [processed] int null, [inprocess] int null, [percenterror] float null ) --add all information to the Temp Table insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByPeriod @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByGMVI @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByHUCG @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByCFTT @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByBATC @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByGAT @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByRSLT @From,@To insert into #ActIfPerfByPeriod execute SapMesHelper_GetActIfPerfByPMNO @From,@To select * from #ActIfPerfByPeriod drop table #ActIfPerfByPeriod Set nocount off END
wobei die procedures oben eigentlich vom Aufbau alle gleich sind und zwar so
CREATE PROCEDURE SapMesHelper_GetActIfPerfByPeriod ( @From datetime, @To datetime ) AS BEGIN /* Procedure Body */ declare @ok int, @initerror int, @remainingerrors int, @processed int, @inprocess int, @percenterror float set @ok = (select count(*) from Tab_SAPMES_Confirmation_INOUT (readuncommitted, fastfirstrow) where direction = 'I' and TimestampLastChange > @from and TimestampLastChange < @To) set @initerror = (select count(*) from Tab_SAPMES_ERROR_INOUT (readuncommitted, fastfirstrow) where direction = 'I' and TimestampLastChange > @from and TimestampLastChange < @To) set @processed = (select count(*) from Tab_SAPMES_TRIGGER_IN (readuncommitted, fastfirstrow) where TimestampLastChange > @from and TimestampLastChange < @To and MessageStatus > 4) set @inprocess = (select count(*) from Tab_SAPMES_TRIGGER_IN (readuncommitted, fastfirstrow) where TimestampLastChange > @from and TimestampLastChange < @To and MessageStatus < 5) if (convert(float, @processed) != 0) begin set @percenterror = round(convert(float, (@processed-@ok))/convert(float, @processed) * 100.0,1) end else begin set @percenterror = 0 end select 'total' as Messagetype, @from as start, @To as ende, @ok as ok, @initerror as initialerror, (@processed-@ok) as remainingerrors, @processed as processed, @inprocess as inprocess, @percenterror as percenterror END
Der Spass kostet Zeit ohne Ende für ein Select über einen Tag:
Query OK, -1 betroffene Reihen (19.719 sec)
Return Code: 0
wobei es ohne (readuncommitted, fastfirstrow)
noch ein vielfaches länger gegangen ist.Kann mir einer sagen wie ich das performater machen kann?
Vielen Dank schon im Voraus
-
Zum einen solltest Du sagen, um welche Datenbank es sich handelt und zum anderen solltest Du solche Kraftausdrücke wie Sch... und besch... nicht verwenden.
-
Also immer einen neue Table anlegen halte ich für .......
Wenn du sowas oft brauchst dann solltest Du dir etwas überlegen ohne den Table immer neu zu erstellen.
Und wenn du es nicht oft brauchst dann sind doch 19sek super
-
naja das mit den Kraftausdrücken ist so ne Sache der Server ist nunmal scheisse, aber das ist ja egal, auch welche Datenbank es betrifft spielt doch gar keine Rolle, es ist eine Datenbank die irgendwer in Tschechien halt mal angelegt hat.
An User naja ich brauche das ganze schon öfter, wie ich das ohne temp Tabelle hin bekomme weiss ich leider nicht, und dazu kommt noch das ich 19 Sekunden recht viel finde, da ich das ganze bei einem Select für 5 Tabellen machen muss. Und dann sind es halt 100 Sekunden, bis das durch ist bekomme ich x Deadlocks
keiner nen Optimierungsvorschlag?
-
Wir brauchen nicht zu wissen, was die Datenbank enthält, sondern welcher Datenbankserver verwendet wird. Gerade Stored-procedures sind Datenbankspezifisch. Sie sehen unter Oracle anders aus als unter MS-SQL-Server oder Postgresql.