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.


Anmelden zum Antworten