2017-02-02 1 views
0

Da ist etwas, das mich über meine Anwendung beunruhigt. Ich habe eine SQL-Abfrage, die eine Reihe von Einfügungen in die Datenbank über verschiedene Tabellen ausführt. Ich habe getimt, wie lange es dauert, bis der Vorgang abgeschlossen ist, es dauert etwa 1,5 Sekunden. An dieser Stelle bin ich noch nicht einmal mit der Entwicklung der Abfrage fertig, ich habe noch mehr Einfügungen, um dies zu programmieren. Ich erwarte also, dass dies noch länger dauert, vielleicht bis zu 3 Sekunden.Ist meine SQL-Transaktion zu lang?

Jetzt ist es wichtig, dass alle diese Daten konsistent sind und entweder vollständig oder gar nicht fertig sind. Also was ich mich wundere ist, ist es in Ordnung, dass eine Transaktion so lange dauert. Blockiert es nicht die Tabelle, also wählt, fügt ein, aktualisiert, etc ... kann nicht ausgeführt werden, bis die Transaktion beendet ist? Meine Sorge ist, wenn diese Abfrage häufig ausgeführt wird, könnte es die gesamte Anwendung sperren, so dass bestimmte Teile davon entweder unglaublich langsam oder unbrauchbar werden. Mit einer geringen Benutzerbasis bezweifle ich, dass dies ein Problem wäre, aber wenn meine Anwendung etwas an Fahrt gewinnen sollte, könnte diese Abfrage möglicherweise eine Menge sein.

Sollte ich darüber besorgt sein oder fehlt mir etwas, wo die Datenbank nicht so handeln wird, wie ich denke. Ich verwende eine SQL Server 2014-Datenbank.

Beachten Sie, dass ich dies mit dem StopWatch-C# -Objekt unmittelbar vor dem Start der Transaktion zeitlich festgelegt habe, und stoppe es sofort, nachdem die Änderungen festgeschrieben wurden. Es ist also so genau wie möglich.

Antwort

0

Ich denke, es hängt von Ihrem Code ab, wie Sie Schleife effektiv verwendet, wählen Sie Abfrage und die andere Aussage.

1

Sie haben zu Recht Bedenken, da eine Transaktion die geschriebenen Zeilen sperrt, bis die Transaktion festgeschrieben wird, was zu Problemen wie Deadlocks und temporärer Blockierung führen kann, die die Systemreaktion verlangsamen. Aber es gibt verschiedene Faktoren, die die möglichen Auswirkungen bestimmen.
Zum Beispiel brauchen Sie sich wahrscheinlich keine Sorgen zu machen, wenn Ihre Benutzer nur ihre eigenen Daten aktualisieren und abfragen, und Ihre Tabellen haben eine Indexierung, um Lese- und Schreibkriterien zu unterstützen. Auf diese Weise wird die Zeilensperrung jedes Benutzers die anderen Benutzer größtenteils nicht beeinflussen - abhängig davon, wie Sie Ihren Code natürlich schreiben.
Wenn Ihre Benutzer Daten freigeben und Sie in der Lage sein möchten, eine effiziente Suche über mehrere Benutzerdaten hinweg zu unterstützen, z. B. mit mehreren gleichzeitigen Aktualisierungen, müssen Sie möglicherweise mehr tun.

Einige allgemeine Konzepte:
- Stellen Sie sicher, Ihre Transaktionen schreiben in der gleichen Reihenfolge Tabellen
- so viel wie möglich geschrieben werden vor Beginn der Transaktion Ihre Transaktionen so kurz wie möglich halten, indem die Daten vor.
- Wenn dies ein neues System ist (und auch wenn es nicht neu ist), sollten Sie auf jeden Fall die Aktivierung der Snapshot-Isolation und/oder des Read Committed Snapshot Isolation auf der Datenbank in Betracht ziehen. SI wird (wenn es explizit für die Sitzung festgelegt wird) zulassen, dass Ihre Leseabfragen nicht durch gleichzeitige Schreibvorgänge blockiert werden. Mit RCSI können alle Ihre Leseabfragen standardmäßig nicht durch gleichzeitige Schreibvorgänge blockiert werden. Aber lesen Sie dies, um sowohl die Vorteile als auch die Probleme beider Isolationsstufen zu verstehen: https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/