Announcement

Collapse
No announcement yet.

Performance von Trigger verbessern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Performance von Trigger verbessern

    Hallo,

    ich habe in meiner Datenbank einen Insert-Trigger, der mir mein ganzes Projekt langsam macht. Der Trigger wird sehr häufig aufgerufen.

    Der Trigger:

    Code:
    BEGIN 
    Batchvalue = 1; 
    SELECT MAX("CHANGECOUNT") FROM "CHANGECOUNTER" into :Batchvalue; Batchvalue = Batchvalue + 1; 
    INSERT INTO "CHANGECOUNTER" ("CHANGEDATE", "CHANGECOUNT") 
    VALUES (CURRENT_TIMESTAMP, :Batchvalue);
    NEW.SFLASTEDITDATE = current_timestamp; 
    NEW."BatchAnchor" = :Batchvalue; 
    END
    Die Tabelle CHANGECOUNTER:

    Code:
    CREATE TABLE CHANGECOUNTER ( 
    CHANGEDATE TIMESTAMP,
     CHANGECOUNT BIGINT
    );
    CREATE INDEX i_CHANGECOUNTER ON CHANGECOUNTER(CHANGECOUNT);
    Wenn ich die Zeile mit dem Insert into Changecounter weg mache wird die ganze Sache schon erheblich schneller. Aber leider benötige ich diese. Die Tabelle CHANGECOUNTER bekommt auch ganz schnell sehr viele Datensätze.

    Hat jemand eine Idee wie ich die ganze Sache optimieren könnte?
    Bei MS-SQL-Servern kann man mit "SET NOCOUNT ON" die performance von Triggern verbessern, gibt es so etwas vielleicht auch in Firebird?


    Vielen Dank


    Boris
    Zuletzt editiert von Boris0815; 08.04.2009, 14:58.

  • #2
    Hallo,

    ohne jetzt zu hinterfragen, ob deine Lösung auch in einer Mehrbenutzerumgebung wie erwartet funktioniert, ein DESCENDING Index auf CHANGECOUNT wird das MAX(...) beschleunigen, vor allem, wenn die Tabelle anwächst. Dein Index ist ASCENDING, was dir bei einem MAX nicht helfen wird.

    Thomas
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo,

      nimm statt des Max() einen Generator (neuerdings Sequence).
      Dann hast du auch das von Thomas angesprochene möglicheProblem bei MehrbenutzerUmg. nicht.

      select gen_id(gen_changecount, 1) into :BatchValue;

      Das gen_id holt sich den jeweils nächsten Wert (das ist das ,1 ).

      Den Generator muss du einmalig auf dein aktuelles max() setzen.


      Heiko

      Comment


      • #4
        Hallo,

        Danke für die Antworten. Ich werde es wahrscheinlich ganz anders lösen,
        aber der Tip mit den Generatoren war Super. Ich hatte mich bisher nicht mit Generatoren beschäftigt, kann ich aber wahrscheinlich für ein anderes Problem nutzen.

        Boris

        Comment

        Working...
        X