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 selects 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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top