Ich habe festgestellt, dass Sie mit der Klausel ( Beispiel hier und hier ) high performance updates
für varchar(max),nvarchar(max),varbinary(max)
Spalten arbeiten können . Leider wird in der offiziellen Dokumentation nichts über Leistungsoptimierung erwähnt ..WRITE
Kann jemand sagen, dass es überhaupt eine Optimierung gibt? Hat jemand einen Leistungstest gemacht? Auch wenn es eine Optimierung gibt, wird dies vermutlich auch nur bestimmte Situationen betreffen.
sql-server-2012
update
varchar
gotqn
quelle
quelle
.WRITE
nur minimal protokolliert werden. Wenn Sie eine große Anzahl von Zeilen aktualisieren, führt dies zu einer geringeren E / A für die Protokolldatei, was möglicherweise zu einer höheren Leistung führt..WRITE
muss der Inhalt der Spalte nicht neu geschrieben werden, sondern es werden lediglich die bereits in der Spalte enthaltenen Daten geändert. Dies zeigt an, dass in der Tabelle selbst weniger E / A erforderlich sind.set statistics io on
den Unterschied in den logischen Lesevorgängen verwenden und einen Blick darauf werfen.lob read-ahead reads
.Antworten:
Die
WRITE
Methode ist minimal protokolliert. Wenn Sie eine reguläreUPDATE
Anweisung verwenden, wird die gesamte Zeichenfolge mit überschriebenFULL LOGGING
. Dies würde bei großen Updates ineffizient werden.Um die Aktualisierung für Datentypen mit großem Wert zu
UPDATE
unterstützen.WRITE
, unterstützt die Syntax die Methode. Dies führt aufgrund der minimalen Protokollierung zu weniger Transaktionsprotokoll - einschließlich des Einfügens oder Anhängens neuer Daten .Hinweis: Die
UPDATE
using-WRITE
Methode schlägt fehl, wenn das ZielLOB
istNULL
.Unten finden Sie eine schnelle und schmutzige Repro, die das Transaktionsprotokoll zeigt, das mit
REGULAR UPDATE
undUPDATE
mit der.WRITE
Methode erstellt wurde.--- Regelmäßiges Update:
- Statistik E / A-Ausgabe
- Transaktionsprotokoll generiert -> 6 Protokollsätze mit 54580 Bytes :
Update mit der
WRITE
Methode:- Statistik IO
- Transaktionsprotokoll generiert -> 3 Protokollsätze mit 464 Bytes :
Der obige Test zeigt, dass die
WRITE
Methode mehr Nutzen in Bezug auf das generierte Transaktionsprotokoll bietet, da es sich um eine minimal protokollierte Operation handelt und weniger logische Lesevorgänge erforderlich sind.Hinweis : Dies ist nur ein Kratzer auf der Oberfläche. Es können mehr Tests durchgeführt werden, um die Leistung tatsächlich zu beweisen, wenn die WRITE-Methode eine bessere Leistung als das reguläre UPDATE erbringt, insbesondere wenn es sich um VARCHAR-, NVARCHAR- oder VARBINARY-Datentypen handelt.
Update (wie vom OP angefordert):
Unten ist die Abfrage zum Finden der
sys.dm_tran_database_transactions
--- oder eine detailliertere Version:
quelle
If the statement inserts or appends new data, the operation is minimally-logged if the database recovery model is simple or bulk-logged
undUpdates to existing data are not minimally-logged
ich denke, imFULL
Wiederherstellungsmodell ist die Protokollierung kein Faktor ( beyondrelational.com/modules/2/blogs/77/Posts/17835/… )FULL
Datenbank des Wiederherstellungsmodells überprüft und es wird tatsächlich weniger protokolliert, wenn er.WRITE
verwendet wird. Ich denke, der obige Link ist falsch.