2009-09-19 10 views
7

Angenommen, ich habe gespeicherte Prozeduren, die Operationen zum Einfügen/Aktualisieren/Löschen in die Tabelle ausführen.Wird die Leistung durch Auslöser verringert? Eingefügte und gelöschte Tabellen?

Abhängig von einigen Kriterien möchte ich einige Operationen durchführen.

Sollte ich Trigger erstellen oder die Operation in der gespeicherten Prozedur selbst ausführen.

Verringert die Verwendung der Trigger die Leistung?

Hat diese beiden Tabellen nämlich Eingefügt und gelöscht existiert (persistent) oder dynamisch erstellt?

Wenn sie dynamisch erstellt werden, hat dies ein Leistungsproblem.

Wenn sie persistente Tabellen sind, wo sind sie dann?

Auch wenn sie exixts dann kann ich zugreifen Eingefügt und Gelöschte Tabellen in gespeicherten Prozeduren?

+0

Die Leistung wird nicht beeinträchtigt, da die eingefügten und gelöschten Tabellen dynamisch erstellt werden und die Datensätze in diesen Tabellen in Triggern eingefügt werden. Wenn wir dasselbe in der gespeicherten Prozedur tun, kommen diese Tabellen nicht ins Bild, was die Leistung erhöht. – Panache

Antwort

0

Leistung auf was? Der Trigger führt nach dem Ereignis eine Aktualisierung der Datenbank durch, damit der Benutzer Ihres Systems nicht einmal weiß, dass es läuft. Es passiert im Hintergrund.

Ihre Frage ist in einer Weise formuliert, die ziemlich schwer zu verstehen ist.

+1

Ich denke, die Frage bezieht sich auf das Vorhandensein der eingefügten und gelöschten Tabellen. Wird diese Leistung durch die Verfügbarkeit dieser Strukturen beeinträchtigt? Mein Bauch sagt nein, aber ich bin mir nicht sicher. –

7

Ja, eine Tabelle mit einem Trigger funktioniert nicht so gut wie ohne sie. Logik diktiert, dass etwas zu tun teurer ist als nichts zu tun.

Ich denke, Ihre Frage wäre sinnvoller, wenn Sie gefragt werden, ob es leistungsfähiger ist als andere Ansätze, die Sie nicht angegeben haben.

Letztendlich würde ich das Werkzeug auswählen, das für den Job am besten geeignet ist, und sich nur um die Leistung kümmern, wenn ein Problem auftritt, und nicht bevor Sie überhaupt eine Lösung implementiert haben.

Eingefügte und gelöschte Tabellen sind innerhalb des Triggers verfügbar. Daher ist das Aufrufen von Stored Procedures ein No-Go.

+0

Sie haben mich richtig, ich will wissen, "ob es leistungsfähiger als jede andere Methode ist" Ich möchte wissen, dass wenn eingefügte und gelöschte Tabellen nur in Triggern zugegriffen werden können, dann erstellt werden, wenn die Trigger ausgelöst werden oder sind sie permanente Tische? und wenn es sich um permanente Tabellen handelt, warum können wir dann nicht auf sie in gespeicherten Prozeduren zugreifen? – Panache

+3

INSERTED und DELETED sind temporäre Tabellen, die für die Dauer Ihres Triggers im Speicher vorhanden sind. Sobald Ihr Auslöser fertig ist, sind sie weg, bis etwas anderes den Auslöser auslöst – Cory

+0

Manchmal ist es eine gute Sache, über die Leistung nachzudenken, bevor man in eine Lösung kommt. Es gibt nichts Schlimmeres, als so weit in ein Projekt zu gehen, nur um zu erkennen, dass man anfangen muss Wiederum - Performance ist bei der Auswahl der richtigen Lösung etwas zu beachten ___ bevor Sie die falsche Lösung implementiert haben –

1

Es verringert die Leistung der Abfrage per Definition: Die Abfrage macht dann etwas, was sie sonst nicht tun würde.

Der andere Weg, um es zu betrachten ist: Wenn Sie manuell tun würden, was auch immer der Auslöser tut, dann erhöhen sie die Leistung, indem sie eine Rundfahrt speichern.

Machen Sie noch einen Schritt weiter: Dieser Vorteil verschwindet, wenn Sie eine gespeicherte Prozedur verwenden und trotzdem innerhalb eines Server-Roundtrips laufen.

So hängt es davon ab, wie Sie es betrachten.

6

Wird es weniger performant sein, als dasselbe in einem gespeicherten Prozess zu tun. Wahrscheinlich nicht, aber bei allen Performance-Fragen ist der einzige Weg, um wirklich zu wissen, beide Ansätze mit einem realistischen Datensatz zu testen (wenn Sie eine 2.000.000 Datensatztabelle haben, testen Sie nicht mit einer Tabelle mit 100 Datensätzen!) Die Auswahl zwischen einem Trigger und einer anderen Methode hängt ganz davon ab, ob die betreffende Aktion ausgeführt werden muss, unabhängig davon, wie die Daten aktualisiert, gelöscht oder eingefügt werden. Wenn dies eine Geschäftsregel ist, die immer passieren muss, egal was passiert, ist ein Trigger der beste Ort dafür, oder Sie haben schließlich Probleme mit der Datenintegrität. Daten in Datenbanken werden häufig aus anderen Quellen als der GUI geändert.

Wenn Sie einen Trigger schreiben, gibt es mehrere Dinge, die Sie beachten sollten. Zunächst wird der Trigger für jeden Batch einmal ausgelöst. Unabhängig davon, ob Sie einen Datensatz oder 100.000 Datensätze eingefügt haben, wird der Trigger nur einmal ausgelöst. Sie können nicht davon ausgehen, dass nur ein Datensatz betroffen ist. Man kann auch nicht davon ausgehen, dass es immer nur ein kleiner Datensatz sein wird. Aus diesem Grund ist es wichtig, alle Trigger so zu schreiben, als würden Sie eine Million Zeilen einfügen, aktualisieren oder löschen. Das bedeutet, setzungsbasierte Logik und keine Cursor oder While-Schleifen, wenn überhaupt möglich. Nimm keinen Stored Proc, der für einen Datensatz geschrieben wurde, und rufe ihn in einem Cursor in einem Trigger auf.

Senden Sie auch keine E-Mails von einem Cursor. Sie möchten nicht alle Einfügungen, Aktualisierungen oder Löschungen stoppen, wenn der E-Mail-Server ausgefallen ist.

Verwandte Themen