Spiegazione richiesta per ELIMINA lentamente con SQL Server


8

Vorrei ottenere ulteriori approfondimenti / ragionamenti sul comportamento di eliminazione di SQL Server. Abbiamo un database abbastanza grande di oltre 1800 GB.

In ci sono alcune tabelle molto superficiali (solo poche colonne intere) con molti milioni di righe. Quando eliminiamo 10.000 di righe da queste tabelle poco profonde, le query di eliminazione sono generalmente piuttosto veloci (al massimo una manciata di secondi).

Abbiamo anche una tabella con un campo di tipo che imagememorizza le immagini con una media di 100 KB. Quando eliminiamo solo poche migliaia di righe da questa tabella, ci vuole molto più di un minuto.

Anche se la differenza è chiara (viene eliminata molta più dimensione dei dati), non vedo l'ora di saperne di più su ciò che accade all'interno di SQL Server. In modo che io possa capire meglio che queste ultime sono molto più lente.

Qualcuno può far luce per favore?


C'è un libro sugli interni di SQL Server se sei interessato a quel genere di cose e vuoi sentire da quelli vicini alla fonte.
stakx,

Il mio sospetto sarebbe che le eliminazioni di immagini generino un sacco di IO casuali o si blocchino su qualcosa. L'eliminazione di alcune 1000 righe non comporterà in alcun modo un minuto di utilizzo completo della CPU.
usr

Risposte:


10

viene eliminata molta più dimensione dei dati

L'eliminazione di un BLOB da 100 imageKB non è in realtà un'operazione di dimensione dei dati. Il BLOB è deallocato, non cancellato e non esiste alcuna registrazione a immagine intera. Puoi facilmente provare questo:

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

I registri che vedrai saranno qualcosa sulla falsariga di:

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

Come puoi vedere, non esiste un record 'DELETE' con +102400 byte di dati per la riga contenente la imagecolonna. Ci sono un sacco di deallocazioni (l'operazione PFS / IAM / GAM) e una semplice eliminazione di righe (heap nel mio caso, sarebbe molto simile per B-Tree se mi fossi ricordato di dichiarare ID come PK ...). Per ulteriori dettagli, vedere Come leggere e interpretare il registro di SQL Server .

Ciò lascia aperta la domanda originale: perché una cancellazione è più lenta dell'altra? Ti consiglio di leggere Come analizzare le prestazioni di SQL Server . Segui la metodologia descritta per catturare le attese per un'istruzione specifica e vedere qual è la causa. Vedere Analisi dell'esecuzione di singole query , in particolare la parte relativa all'analisi dei tempi di attesa dell'esecuzione di singole query. Solo dopo aver misurato saremo in grado di rispondere all'enigma. potrebbero esserci molti fattori: più blocchi dovuti a letture simultanee sulla tabella BLOB, indici mancanti per individuare le righe candidate DELETE su una tabella, trigger in esecuzione ecc. ecc. La metodologia collegata ti aiuterà a individuare la causa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.