SQL Server „Dry Run“ -Modus? Ladedatenpuffer, ohne Sperren zu Halten oder Ändern von Daten
-
24-09-2019 - |
Frage
i werde einige Abfragen für eine SQL-Server-Datenbank ausgeführt wird, durch einen Lösch gefolgt. Idealer All dies geschieht innerhalb einer Transaktion (d.h. atomic).
Aber praktisch, weil die Daten längst von den Puffern gespült worden, SQL Server wird eine Menge von physischen IO, um durchführen, um den getätigten T-SQL abzuschließen. Dies kann ein Problem sein, denn wenn die gesamte Charge dauert länger als 30 Sekunden laufen, dann werden die Nutzer Timeout-Probleme auftreten.
Ich bemerkte, dass, wenn ich meine select
s in Stücke laufen, jedes Mal mehr und mehr von der letzten SQL ausgeführt wird, lässt SQL Server die Puffer mit mehr und mehr der erforderlichen Daten füllen. z.
First run :
BEGIN TRANSACTION
SELECT ... WHERE ...
ROLLBACK
Zweiter Lauf :
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
ROLLBACK
...
n-ten Durchlauf :
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
ROLLBACK
Und durch die Zeit, die ich erreichen den Endlauf :
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT
Der gesamte Ansatz läuft schnell, da die Puffer vorgefüllt werden.
Gibt es einen Modus von SQL Server (das heißt SET NOEXEC ON
), auf dem SQL Server nicht ausführen verursachen würde keine tatsächlichen Datenänderungen, keine Sperren nehmen, aber die Puffer mit den benötigten Daten füllen? z.
SET NOEXEC ON
EXECUTE ThatThingYouDo
SET NOEXEC OFF
EXECUTE ThatThingYouDo
oder
SET DRYRUN ON
EXECUTE ThatThingYouDo
SET DRYRUN OFF
EXECUTE ThatThingYouDo
Lösung
Nein.
Angenommen, Sie haben INSERT von UPDATE auf den eingefügten Zeilen gefolgt. Sie werden nie das Update emulieren können, da die eingefügten Zeilen nicht existieren. Nun, in diesem Fall, warum sind Ihre wählt in einer Transaktion? In der Standardeinstellung (das heißt, es sei denn Sie verwenden HOLDLOCK oder ähnliches), werden Sie die Zeilen für die Dauer der Transaktion nicht sperren.
Wenn Sie der Puffer-Pool (auch bekannt als die Daten-Cache) denken, ist „voll“, dann brauchen Sie mehr RAM oder eine andere Upgrade / skalieren.
Andere Tipps
Ich habe festgestellt, dass, wenn Sie versuchen, etwas zu tun, extrem aus dem normalen, ein Problem zu lösen, dass Sie grundlegendes Design ist wahrscheinlich das Problem. Das ist extrem aus dem normal.
Vielleicht könnten Sie weitere Informationen über die DELETE liefern (Tabelle Größe, Aktivität, Index, Zeilen zu löschen, andere Prozesse ausgeführt wird, usw.), die so lange dauert, und es wird eine herkömmliche Lösung sein, einen Index oder eine Verriegelung, usw. zu Adresse es.