In Bezug auf die Datengröße werden viel mehr Daten gelöscht
Das Löschen eines 100-KB- image
Blobs ist eigentlich keine Operation mit Datengröße. Der Blob wird freigegeben, nicht gelöscht, und es erfolgt keine Vollbildprotokollierung. Sie können dies leicht testen:
create database blob
go
use blob
go
create table t (id int not null identity(1,1), blob image)
go
insert into t (blob) values (
replicate(
cast(0x000102030405060708090a0b0c0d0e0f as varbinary(max)),
100*1024/16))
go 10
alter database blob set recovery full
go
backup database blob to disk='nul:'
go
delete from t where id = 3
go
select * from fn_dblog(null, null)
go
Die Protokolldatensätze, die Sie sehen, sehen wie folgt aus:
00000026:0000008e:0001 LOP_BEGIN_XACT LCX_NULL 0000:00000304 0x0000 76 124
00000026:0000008e:0002 LOP_LOCK_XACT LCX_NULL 0000:00000304 0x0000 24 56
00000026:0000008e:0003 LOP_MODIFY_ROW LCX_PFS 0000:00000304 0x0000 62 92
00000026:0000008e:0004 LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
00000026:0000008e:0005 LOP_MODIFY_ROW LCX_PFS 0000:00000304 0x0000 62 92
00000026:0000008e:0006 LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
00000026:0000008e:0007 LOP_MODIFY_ROW LCX_PFS 0000:00000304 0x0000 62 92
00000026:0000008e:0008 LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
00000026:0000008e:0009 LOP_MODIFY_ROW LCX_PFS 0000:00000304 0x0000 62 92
00000026:0000008e:000a LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
00000026:0000008e:000b LOP_MODIFY_ROW LCX_PFS 0000:00000304 0x0000 62 92
00000026:0000008e:000c LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
...
00000026:0000008e:0022 LOP_HOBT_DELTA LCX_NULL 0000:00000304 0x0000 64 64
00000026:0000008e:0023 LOP_DELETE_ROWS LCX_TEXT_MIX 0000:00000304 0x0000 62 172
00000026:0000008e:0024 LOP_DELETE_ROWS LCX_HEAP 0000:00000304 0x0000 62 120
00000026:0000008e:0025 LOP_COMMIT_XACT LCX_NULL 0000:00000304 0x0000 80 84
Wie Sie sehen können, gibt es keinen 'DELETE'-Datensatz mit +102400 Datenbytes für die Zeile, die die image
Spalte enthält. Es gibt eine Reihe von Freigaben (die PFS / IAM / GAM-Operation) und eine einfache Zeilenlöschung (Heap würde in meinem Fall für B-Tree sehr ähnlich aussehen, wenn ich daran gedacht hätte, ID als PK zu deklarieren ...). Weitere Informationen finden Sie unter Lesen und Interpretieren des SQL Server-Protokolls .
Was die ursprüngliche Frage offen lässt: Warum ist ein Löschvorgang langsamer als der andere? Ich empfehle Ihnen , die Analyse der SQL Server-Leistung zu lesen . Befolgen Sie die beschriebene Methode, um die Wartezeiten für eine bestimmte Anweisung zu erfassen und die Ursache zu ermitteln. Siehe Analysieren der Ausführung einzelner Abfragen , insbesondere den Teil Analysieren der Wartezeiten für die Ausführung einzelner Abfragen. Erst nachdem Sie gemessen haben, können wir das Rätsel beantworten. Es kann viele Faktoren geben: Mehr Blockierung aufgrund gleichzeitiger Lesevorgänge in der Blob-Tabelle, fehlende Indizes zum Auffinden der DELETE-Kandidatenzeilen in einer Tabelle, Ausführen von Triggern usw. usw. Die verknüpfte Methode hilft Ihnen dabei, die Ursache zu ermitteln.