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.
fonte
2010-03-06 14:24:45
Hmm, interessante ... stai mantenendo più che si sta eliminando? O meno? –
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. –
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). –