Ecco il problema che sto cercando di risolvere: ho recentemente completato un re-design strato di dati che mi permette di bilanciare il carico mio database su più frammenti. Al fine di mantenere cocci equilibrata, ho bisogno di essere in grado di migrare i dati da un frammento all'altro, che coinvolge la copia dal frammento A al frammento B, e quindi eliminando i record frammento A. Ma ho diversi tavoli che sono molto grandi, e hanno molte chiavi esterne puntate su di esse, quindi l'eliminazione di un singolo record dalla tabella può richiedere più di un secondo.Come velocizzare le eliminazioni da una tabella di database di grandi dimensioni?
In alcuni casi ho bisogno di eliminare milioni di record dalle tabelle, e ci vuole troppo tempo per essere pratico.
La disabilitazione chiavi esterne non è un'opzione. Anche l'eliminazione di batch di righe di grandi dimensioni non è un'opzione, poiché si tratta di un'applicazione di produzione e le eliminazioni più grandi bloccano troppe risorse, causando errori. Utilizzo Sql Server e conosco le tabelle partizionate, ma le restrizioni sul partizionamento (e le tariffe di licenza per l'edizione aziendale) sono così poco realistiche che non sono possibili.
Quando ho iniziato a lavorare su questo problema ho pensato che la parte difficile sarebbe stata scrivere l'algoritmo che capiva come eliminare le righe dal livello foglia fino alla cima del modello dati, in modo che nessun vincolo di chiave esterna venga violato la via. Ma risolvere il problema non mi ha aiutato, perché ci vogliono settimane per cancellare i record che devono scomparire dall'oggi al domani.
Ho già costruito un modo per contrassegnare i dati come virtualmente cancellati, quindi per quanto riguarda l'applicazione, i dati sono spariti, ma mi occupo ancora di file di dati di grandi dimensioni, backup di grandi dimensioni e query più lente a causa di la vastità dei tavoli.
Qualche idea? Ho già letto qui post più vecchi e non ho trovato nulla che possa aiutare.
Perché non si può disattivare temporaneamente le chiavi esterne? Non si può eseguire questo durante un periodo di manutenzione e disabilitare l'accesso al sistema? – cjk
Sarebbe un'opzione per rimuovere la necessità di fare questo processo di copia del tutto? Assicurando tramite alcuni algoritmi che i record siano divisi equamente tra i frammenti della parola go, piuttosto che dover spostare i record una volta che sono stati creati per bilanciarli. – AdaTheDev
@AdaTheDev, per i nuovi frammenti non è un problema, ma la mia distribuzione iniziale era un backup-restore, e su ogni copia, segnare metà dei dati come virtualmente cancellati. Quindi quei due frammenti sono enormi. @ Mitch, il punto delle schegge è usare attrezzature più economiche, quindi non spenderò soldi per risolvere il problema. @ck, non sono sicuro che gli FK siano il vero problema. Penso che la maggiore percentuale di tempo trascorso sia l'eliminazione dell'indice cluster. –