Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Il modo più efficiente per spostare le righe della tabella da una tabella all'altra

Un'altra soluzione è utilizzare più schemi e giocare a switch-a-roo. Preferisco questo metodo solo perché ero solito eseguire questo trucco in un lavoro e il messaggio di avviso sulla ridenominazione di un oggetto (che non può essere soppresso) stava riempiendo i miei registri della cronologia. Fondamentalmente hai bisogno di due schemi aggiuntivi (uno per conservare temporaneamente una copia della tabella e uno per conservare la copia memorizzata nella cache).

CREATE SCHEMA cache AUTHORIZATION dbo;
CREATE SCHEMA hold  AUTHORIZATION dbo;

Ora, crea un'imitazione della tabella nello schema della cache:

SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0;
-- then create any indexes etc.

Ora, quando arriva il momento di aggiornare i dati:

-- step 1:
TRUNCATE TABLE cache.table;
-- (if you need to maintain FKs you may need to delete)
INSERT INTO cache.table SELECT ...

-- step 2:
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION;
  ALTER SCHEMA hold  TRANSFER dbo.table;
  ALTER SCHEMA dbo   TRANSFER cache.table;
  ALTER SCHEMA cache TRANSFER hold.table;
COMMIT TRANSACTION;

In teoria, potresti spostare l'ultimo trasferimento fuori dalla transazione, perché gli utenti potrebbero inizia a interrogare la nuova copia di dbo.table dopo il secondo trasferimento, ma come ho detto, questo è quasi istantaneo, quindi sarei sorpreso se notassi differenze nella simultaneità.

Puoi anche troncare facoltativamente cache.table di nuovo qui, ma l'ho sempre tenuto popolato in modo da poter confrontare le modifiche ai dati o risolvere i problemi se qualcosa è andato storto. A seconda della durata del passaggio 1, potrebbe essere più veloce eseguire i trasferimenti al contrario piuttosto che ripopolare da zero.

Come la ridenominazione, puoi ottenere cose stravaganti da questo processo, come le statistiche che si perdono mentre si spostano con il tavolo effettivo, non si attaccano al nome. E come rinominare, ti consigliamo di testarlo e potresti voler giocare con i livelli di isolamento, ad es. RCSI per l'accesso alla tabella di segnalazione.