Migliora la velocità di eliminazione per SQL Server


12

Abbiamo un enorme database di produzione, la sua dimensione è di circa 300 GB. Esiste un approccio per migliorare le prestazioni di una query di eliminazione? In questo momento la velocità di eliminazione è compresa tra 1 e 10k al minuto, per noi è molto lenta.


2
1000 file al minuto sembrano estremamente lenti. Stai vivendo un blocco? O è altrettanto lento selezionare anche le righe, il che suggerirebbe la necessità di un indice?
James Z,

Probabilmente devi creare un indice per coprire i tuoi criteri di eliminazione.
Ginden,

6
Non ci sono abbastanza dettagli per fornire una risposta. Quale query esegui? Hai indici nelle colonne dei criteri coinvolti (se ce ne sono)? Hai trigger per l'eliminazione? ...
Sébastien Sevrin,

3
Stai cercando di eliminare un miliardo di righe alla volta? È possibile che tu stia aspettando l'autogrow dopo l'autogrow dopo l'autogrow? (È più che probabile che sia l'attività di registro che stai aspettando, non l'attività di eliminazione effettiva.) Vedi questo articolo ...
Aaron Bertrand

3
Anche. Eventuali vincoli di chiave esterna? Fornisci definizione completa della tabella, query e piano di esecuzione.
Martin Smith,

Risposte:


20

Se si sta tentando di eliminare un numero elevato di righe in una singola istruzione, è probabile che si stia aspettando l'attività del registro. Così puoi:

  1. Assicurati che il tuo registro sia adeguatamente dimensionato in modo che gli eventi di crescita non ti rallentino. Con le impostazioni predefinite, il registro probabilmente inizia a 1 MB con una crescita del 10%. Gli eventi di crescita sono costosi e se si registrano anche solo 10 GB di eliminazioni, questo distruggerà le prestazioni non solo ora ma anche in futuro (a causa di ciò che ciò fa ai VLF).
  2. Se si sta eliminando l'intera tabella, utilizzare TRUNCATEo DROP/ CREATE.
  3. Se si sta eliminando la maggior parte della tabella, utilizzare SELECT INTOper inserire i dati che si desidera conservare in un'altra tabella TRUNCATE, quindi spostare indietro la piccola parte. (O semplicemente rilasciare la vecchia tabella, rinominare la nuova e riapplicare vincoli / autorizzazioni ecc.)
  4. Ridurre al minimo l'impatto della registrazione in primo luogo eliminando i dati in blocchi anziché tutti in una volta. Vedere questo articolo . Puoi anche considerare di passare temporaneamente al ripristino semplice, in modo da dover solo CHECKPOINTcancellare il registro invece di eseguire i backup del registro, ma devi essere sicuro di ripristinarlo e di eseguire un nuovo backup completo per riavviare la catena di registro .

+1, da parte mia per un eccellente articolo. Questo mi ha aiutato in passato a far capire ai nostri sviluppatori l'operazione di eliminazione quando continuano a raggiungerci per la lentezza e la crescita del file di registro.
KASQLDBA,

Inoltre, se sono presenti indici non necessari, rilasciarli aumenterà la velocità di eliminazione. Anche in questo caso, se si eliminano tutti o quasi tutti i dati, eliminare prima tutti gli indici e crearli nuovamente in seguito può avere un impatto positivo.
Tony Hinkle,

3
Anche @Tony che elimina l'indice deve essere registrato (così come crearlo), quindi potrebbe essere solo una questione di quando vuoi pagare quel costo. Senza test, non sono convinto che ci sia un enorme vantaggio per lo scenario di eliminazione (come ci sarebbe per inserire / aggiornare), a meno che tu non abbia indici che non manterrai in seguito.
Aaron Bertrand

La disabilitazione temporanea dei vincoli FK può migliorare la query?
Lev Z,

3

Ci sono alcuni suggerimenti, ma quale versione stai usando? È un'edizione aziendale? Comunque:

  1. Se possibile, spostare il registro delle transazioni su un disco più veloce
  2. Analizza il dove . Utilizzerà un indice per identificare i record da eliminare? In caso contrario, puoi aggiungere un indice?
  3. Hai qualche indice sul tavolo che puoi eliminare? Se sì, lasciali cadere.
  4. Hai chiavi esterne rispetto a questa tabella? Questi possono davvero rallentare la tua cancellazione.
  5. Se hai una versione enterprise e il collo di bottiglia è l'IO del disco, una compressione a livello di riga, può darti un piccolo aiuto (o no, a seconda dei tuoi dati)
  6. Puoi partizionare la tabella? Gli indici locali e il rilascio di partizioni possono essere più veloci.
  7. Indagare dove si trova il collo di bottiglia tramite Activity Monitor.

Aggiungi dettagli, quando lavori con un grande database non c'è una sola risposta valida.


0

Dovresti provare a eliminarli a blocchi, probabilmente eliminando in loop, ogni iterazione di eliminazione è la propria transazione e quindi azzerando il registro alla fine di ogni iterazione di loop.

Inoltre, è necessario trovare il numero che si intende utilizzare come valore nel blocco per eliminare i record. Richiede un test approfondito, sarebbe meglio se si potesse testare prima il valore del blocco in UAT.

Su come procedere, farebbe riferimento a Rompere le grandi operazioni di eliminazione in blocchi


0

l'eliminazione può essere lenta se la tabella grande ha una chiave esterna ricorsiva.

in tal caso, trovare il tempo opportuno, disabilitare i servizi dipendenti, disabilitare la chiave esterna ricorsiva, eseguire l'eliminazione massiva, quindi ripristinare nuovamente la chiave esterna.


questo era esattamente il mio caso. Disabilitare il contagio è un po 'rischioso, ma la cancellazione è passata da 1 riga / seocnd a 500 / secondo
Jurion,

0

Aggiunta di pochi altri punti ...

  1. Prova a verificare se il predicato ha un indice e vedi anche le statistiche.
  2. Se si sta eliminando un numero elevato di righe e non si desidera anche l'opzione della tabella temporanea. Vai per tablockopzione.
  3. Verifica se hai dei trigger, in particolare dopo i trigger di eliminazione.

Per ottenere ulteriore assistenza, pubblica la query che stai utilizzando, le informazioni sulla tabella più eventuali informazioni di blocco.

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.