Ho un database SQL Server di grandi dimensioni con una tabella di circa 45 milioni di record. Sto archiviando questa tabella e devo rimuovere tutte le voci più grandi di due anni fa. Ho l'inserimento nella mia tabella di archivio che funziona bene, ma sto avendo problemi con l'efficienza quando si elimina.SQL Server 2000 Delete Top (1000)
Il mio problema si trova all'interno degli indici attualmente sul tavolo. Vorrei eliminare (e inserire l'archivio) in 1000 blocchi di record. Per fare questo, ho bisogno di determinare i "primi" 1000 record che soddisfano il requisito (maggiore di due anni). Il timbro DateTime sulla riga è un indice cluster, quindi è ottimo per afferrare le righe. Tuttavia SQL 2000 non consente CANCELLA TOP 1000 .... quindi ho bisogno di fare qualcosa di simile:
DELETE FROM <table> WHERE [UniqueID] IN
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)
Questo grande lavoro, se UniqueID è stato indicizzato. Dal momento che non lo è, questo richiede molto tempo (è la scansione della tabella per ciascuno dei 1000 record da eliminare). Non ci sono altri indici sulla tabella che identificano in modo univoco i record. Mi è stato detto che sarebbe troppo costoso calcolare un indice su UniqueID, dato che si tratta di un DB live. Qualcuno può indicare un modo per ottimizzare questa query?
Come mai sei riuscito ad aggiungere una colonna denominata UniqueID, che identifica le righe, ma non ha indice? Non hai una chiave primaria? –
Non ho progettato il tavolo, sono un nuovo programmatore del progetto incaricato di archiviarlo. Si tratta di una tabella di scrittura pesante (utilizzata per la registrazione), ma non molto in termini di letture, pertanto la creazione di un indice aggiuntivo (o PK, per quella materia) causerebbe aggiunte non necessarie al tempo di inserimento. Ancora non è come l'avrei progettato, ma è quello che è. – Kevin
La persona che ti ha detto che era troppo costoso da indicizzare sta mentendo. :-) – onupdatecascade