2009-04-27 11 views
14

Abbiamo attraversato una situazione leggermente strana. Fondamentalmente ci sono due tabelle in uno dei nostri database che vengono alimentate con tonnellate e tonnellate di informazioni di registrazione di cui non abbiamo bisogno o che ci interessano. In parte a causa di questo stiamo esaurendo lo spazio su disco.Qual è il modo migliore per eliminare tutta una tabella grande in t-sql?

sto cercando di pulire i tavoli, ma sta prendendo sempre (ci sono ancora 57,000,000+ record dopo lasciando che questo percorso attraverso il fine settimana ... e questo è solo il primo tavolo!)

Usando solo cancellare il tavolo sta prendendo per sempre e mangia spazio su disco (credo per via del log delle transazioni). In questo momento sto usando un ciclo while per eliminare i record X alla volta, mentre gioco con X per determinare cosa è effettivamente il più veloce. Ad esempio X = 1000 impiega 3 secondi, mentre X = 100.000 impiegano 26 secondi ... il che fa la matematica è leggermente più veloce.

Ma la domanda è se c'è o no un modo migliore?

(Una volta fatto questo, andando a eseguire un processo di Agente SQL andare pulire il tavolo, una volta fuori un giorno ... ma ha bisogno sgomberato prima.)

+0

Stai rimozione di tutti i record nella tabella? –

+0

Questo non è da GFI è? –

+0

Non so cosa sia GFI ... quindi probabilmente no. – CodeRedick

risposta

20

TRUNCATE tavolo o disattivare gli indici prima di eliminare

TRUNCATE TABLE [tablename] 

Il troncamento rimuoverà tutti i record dalla tabella senza registrare ogni eliminazione separatamente.

+1

vale la pena di collegarsi a http://en.wikipedia.org/wiki/Truncate_(SQL) come un salto per essere sicuri che capiscono le limitazioni, ma con tutto il cuore concordano con il consiglio – ShuggyCoUk

+1

Potrebbe valere la pena di menzionare, che per 'IDENTITÀ 'columns a' TRUNCATE 'significa che il prossimo valore 'INSERT'ed otterrà un valore identitario del' SEED della tabella' (di solito 1). Questo potrebbe non essere sempre desiderato. – Oliver

2
TRUNCATE TABLE [tablename] 

eliminerà tutti i record senza registrazione.

+1

eseguirà una registrazione minima, registrerà solo le pagine e le estensioni interessate. – SQLMenace

4

1) troncare la tabella

2) lo script la tabella, eliminare e ricreare la tabella

2

A seconda di quanto si vuole tenere, si può solo copiare i record da una tabella temporanea, troncare la tabella dei registri e copiare nuovamente i record della tabella temporanea nella tabella dei registri.

7

Per aggiungere alle altre risposte, se si desidera conservare i dati del giorno passato (o il mese scorso o l'anno o qualsiasi altra cosa), quindi salvarlo, eseguire TRUNCATE TABLE, quindi inserirlo di nuovo nella tabella originale:

SELECT 
    * 
INTO 
    tmp_My_Table 
FROM 
    My_Table 
WHERE 
    <Some_Criteria> 

TRUNCATE TABLE My_Table 

INSERT INTO My_Table SELECT * FROM tmp_My_Table 

La prossima cosa da fare è chiedersi perché si sta inserendo tutte queste informazioni in un registro se nessuno si preoccupa a questo proposito. Se davvero non ne hai affatto bisogno, disattiva la registrazione alla fonte.

+0

Software di terze parti ... :( – CodeRedick

+0

Hai le mie condoglianze;) –

0

Se riesci a calcolare il valore x ottimale, il ciclo di eliminazione verrà eseguito costantemente alla massima velocità. L'impostazione del conteggio delle righe limita il numero di record che verranno cancellati in ogni fase del ciclo. Se il file di registro sta diventando troppo grande; attaccare un contatore nel ciclo e troncare ogni milione di righe o giù di lì.

set @@ conteggio delle righe x mentre 1 = 1 Iniziare

eliminare dalla tabella Se @@ conteggio delle righe = 0 pausa

Fine

Modificare la modalità di registrazione sul db a semplice o bulk logger ridurrà parte dell'overhead di eliminazione.

Problemi correlati