2009-10-26 12 views
17

Ho impostato correttamente FILESTREAM sul mio server SQL 2008; tuttavia, ho notato che anche quando ho eliminato le righe contenenti dati FILESTREAM, il file dei dati fisici sembra non essere cancellato.I file FILESTREAM vengono lasciati dopo la riga eliminata

In base al file fisico, si intende il file nella directory gestita di SQLServer con un identificatore univoco come nome file, non il file originale aggiunto al dbase.

Qualcuno sa se SQLServer cancellerà il file? Se ci sono molti file di grandi dimensioni rimossi dal dbase, mi aspetterei di poter recuperare lo spazio rapidamente, tutto qui.

Grazie,

Dale dati

risposta

20

FILESTREAM è soggetto al controllo delle transazioni e quindi non viene eliminato immediatamente.

Invece, SQL Server esegue un garbage collector che cancella i vecchi dati quando è sicuro che sia stato eliminato definitivamente.

Dal documentation:

FILESTREAM garbage collection è un processo in background che viene attivato dal processo di database di checkpoint. Un checkpoint viene eseguito automaticamente quando è stato generato un log delle transazioni sufficiente. Per ulteriori informazioni, consultare la documentazione in linea di SQL Server 2008 "CHECKPOINT e la porzione attiva del registro" (http://msdn.microsoft.com/en-us/library/ms189573.aspx). Dato che le operazioni del file FILESTREAM vengono registrate in modo minimale nel log delle transazioni del database, potrebbe essere necessario un po 'di tempo prima che il numero di record del log delle transazioni generati attivi un processo di checkpoint e si verifichi la garbage collection. Se questo diventa un problema, puoi forzare la garbage collection usando la dichiarazione CHECKPOINT.

2

DELETE FROM tbl_XXX DICHIARARE @test CHECKPOINT @test = 0

Esegui questo server SQL e È possibile osservare il file ottenere eliminato dal file system anche ..

È possibile impostare il il numero di minuti o secondi di attesa per il garbage collector per ripulire i file dal filesystem dopo aver eseguito l'operazione di cancellazione.

Grazie

haranath

+0

più semplice: DELETE FROM tabella CHECKPOINT – DanDan

+1

@DanDan So che questo è come anni fa ma voglio solo avvertire gli altri utenti del pericolo di cancellare accidentalmente tutte le righe della tabella quando il comando 'DELETE FROM CHECKPOINT' è Usato. Ho provato e ha cancellato tutte le righe nel mio tavolo. Fortunatamente la mia tabella contiene solo dati di esempio. – corix010

13

uso

sp_filestream_force_garbage_collection 

purtroppo questo funziona solo> = SQL Server 2012

+2

FYI - Questo è solo per SQL 2012 – NotMe

+0

Sì, grazie. Ho anche bisogno di questo. Un buon motivo per passare al 2012! – LaBracca

+0

Ho provato questo sul mio SQL Server 2012 Express locale e non sembra funzionare. – corix010

Problemi correlati