2010-03-05 15 views
16

Come eliminare record dalle tabelle di SQL Server 2005 senza registrarli nei registri delle transazioni.Elimina record di SQL Server 2005 senza registrazione

Non desidero accedere perché una volta cancellati, quei record non saranno mai più necessari.

Attualmente le varie eliminazioni richiedono troppo tempo. Ci sono altre opzioni per migliorare le prestazioni delle istruzioni di eliminazione? Non posso usare truncate poiché c'è una clausola where necessaria.

+1

Hmm, interessante ... stai mantenendo più che si sta eliminando? O meno? –

+0

Non lo so. Ma nella maggior parte dei casi tengo meno e cancelli di più. I record da eliminare sono troppi nei numeri e da molte tabelle. In realtà è per una routine di spurgo. –

+2

In questo caso, potrebbe essere interessante vedere se è possibile inserire il "da conservare" in una tabella temporanea, troncare la tabella principale e inserirla nuovamente in quella principale. (Potrebbe essere necessario fare alcune cose strane per mantenere le identità, ecc., Ma potrebbe valere la pena provare, ma sospetto che qualcuno possa avere un'idea migliore). –

risposta

1

Prima di tutto, si noti che non si può NON avere un registro delle transazioni .. cosa succede se si perde potenza nel server mentre si effettua un'enorme cancellazione? Queste informazioni sono necessarie in modo SQL Server può eseguire atomic operations ..

Ciò che potrebbe essere di vostro interesse, però, è "modello di recupero” Si prega di leggere questo articolo su TechNet:. http://technet.microsoft.com/en-us/library/ms189275.aspx

4

Se si sta eliminando un'intera tabella potrebbe utilizzare TRUNCATE TABLE, che registra solo le deallocazioni della pagina anziché avere una voce per ogni riga eliminata.Non sono a conoscenza di alcun modo per fare cancellazioni senza alcuna registrazione delle transazioni.

+3

'TRUNCATE TABLE' rimuove * tutti * i record dalla tabella –

+0

Quindi? Quelli ancora necessari possono essere memorizzati in una tabella temporanea;) Poi sono tornati nella tabella ora vuota. – TomTom

+0

La tabella troncata non funzionerà se la tabella ha vincoli di chiave esterna. – Marques

0

Stai eliminando materiale, ma tu avere una clausola where, quindi si applicano le solite raccomandazioni sulle prestazioni relative a SQL

Hai utilizzato il SQL Profiler per vedere il piano di esecuzione delle richieste? Se si registrano queste operazioni, è possibile utilizzare la procedura guidata delle prestazioni per analizzarle e suggerire eventualmente un nuovo indice.

Se si eseguono molte istruzioni di eliminazione singole (eliminare ... dove id = xxx), è preferibile creare una tabella temporanea con tutti gli ID e unirsi a questa tabella temporanea per avere un'unica istruzione di eliminazione.

6

Penso che tu stia confondendo il concetto di un log delle transazioni nel database. La funzione primaria del log delle transazioni non è il ripristino delle vecchie righe: il lavoro consiste nel mantenere la coerenza del database. Tutte le modifiche passano attraverso il registro delle transazioni e non c'è modo di aggirarle. È una buona cosa. Un log delle transazioni viene anche utilizzato per eseguire backup e ripristini point-in-time del database e viene utilizzato durante il mirroring tra due server.

Se si dispone di eliminazioni che richiedono troppo tempo, è necessario prima cercare in un paio di aree.

1) Esistono attivatori DELETE che stanno sparando sui tuoi tavoli? Se è così, quelli potrebbero essere una fonte di lentezza.

2) Il DBA ha configurato correttamente il database, come minimo, mantenendo il registro delle transazioni e i file di dati su dischi fisici separati?

3) Avete un sacco di chiavi esterne che vengono controllate? Ad esempio, se si dispone di un'altra tabella che fa riferimento alla tabella da cui si sta eliminando, il server del database controllerà ogni eliminazione sulle tabelle di riferimento per assicurarsi che l'istruzione delete non causi l'incoerenza di quelle altre tabelle.

4) Esistono troppi indici o un carico di indicizzazione altrimenti elevato sul tavolo da cui si sta eliminando? Ogni riga eliminata corrisponderà a una voce in ogni indice che viene eliminato, quindi sii prudente sull'uso degli indici. I tuoi indici sono correttamente mantenuti?

5) È necessario molto tempo per cercare le righe che si desidera eliminare? Se la clausola WHERE sulla tua istruzione DELETE è troppo costosa, questo rallenterà davvero le tue eliminazioni.Prova a modificare temporaneamente la tua istruzione DELETE in un'istruzione SELECT e verifica se la query viene eseguita rapidamente. In caso contrario, è necessario ottimizzare l'istruzione SELECT modificandola, ristrutturando le tabelle o aggiungendo gli indici appropriati. Quindi cambia la frase in DELETE. Le prestazioni dovrebbero essere migliorate in modo significativo se l'esecuzione della corrispondente istruzione SELECT è migliorata durante l'ottimizzazione.

Se si dispone di un grosso lavoro batch che esegue molte eliminazioni contro le tabelle, è possibile che si desideri disabilitare temporaneamente i trigger o che si desideri eliminare e ricreare gli indici e le chiavi esterne dopo questi batch di eliminazione. Anche questo potrebbe accelerare le cose.

4

Dimenticate il registro delle transazioni come origine della velocità o qualsiasi altra cosa diversa da qualcosa utilizzato internamente dal DB per mantenere la coerenza. Invece, dovresti considerare di trovare un modo per fare l'eliminazione in lotti. Invece di una singola istruzione delete, e se nella tabella è presente un PK intero, provare a eliminare intervalli di valori e farlo in un ciclo. Quindi, qualcosa di simile a

Declare @RecordsLeft int 
Declare @StartRange int 
Declare @EndRange int 
Declare @BatchSize int 

Set @BatchSize = 10000 
Set @RecordsLeft = (Select Count(*) From ...) 
Set @StartRange = 0 
Set @EndRange = @StartRange + @BatchSize 

While @RecordsLeft > 0 
Begin 
    Delete ... 
    Where ... 
     And PK Between @StartRange And @EndRange 

    Set @RecordsLeft = (Select Count(*) From ...) 
    Set @StartRange = @EndRange + 1 
    Set @EndRange = @StartRange + @BatchSize 
End 
+0

Funziona. Grazie. – fkucukbaltaci

16

E 'facile:

DECLARE @BatchSize INT 
SET @BatchSize = 100000 

WHILE @BatchSize <> 0 
BEGIN 
    DELETE TOP (@BatchSize) 
    FROM [dbo].[UnknownTable] 
    SET @BatchSize = @@rowcount 
END 
+0

bella soluzione nel caso in cui non si dispone di autorizzazioni TRUNCATE TABLE, grazie! –

+0

Qualcuno può confermare (o smentire) che questa è una ** soluzione ** reale? Sono molto scettico su questo, non penso che 'TOP' fermi ogni record cancellato che viene registrato ... – MarioDS

+0

Qui - http://dba.stackexchange.com/a/1751 si tratta della stessa soluzione ma un po 'di più compact – sarh

2

solo cercare di eliminare i record con l'aggiunta di queste dichiarazioni prima e dopo le istruzioni DELETE. traceon(610) e traceoff(610). è come questo

dbcc traceon(610) 

--Your Delete Statement 
delete statement 


dbcc traceoff(610) 
+0

Sembra che il flag di traccia 610 non sia rilevante per sql 2005. L'istruzione "funziona" senza errori, ma nessun risultato. – sarh

Problemi correlati