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

Den mest effektive måde at flytte tabelrækker fra en tabel til en anden

En anden løsning er at bruge flere skemaer og spille switch-a-roo. Jeg foretrækker kun denne metode, fordi jeg plejede at lave dette trick i et job, og advarselsmeddelelsen om at omdøbe et objekt (som ikke kan undertrykkes) fyldte mine historielogfiler. Grundlæggende har du brug for to ekstra skemaer (et til midlertidigt at opbevare en kopi af tabellen og et til at opbevare den cachelagrede kopi).

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

Opret nu en efterligning af tabellen i cacheskemaet:

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

Når det nu er tid til at opdatere dataene:

-- 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;

Teoretisk set kunne du flytte den sidste overførsel ud af transaktionen, fordi brugere kunne Begynd at forespørge efter den nye kopi af dbo.table efter den anden overførsel, men som jeg sagde, er dette næsten øjeblikkeligt, så jeg vil blive overrasket, hvis du ser nogen forskel i samtidighed.

Du kan også valgfrit afkorte cache.table igen her, men jeg holdt det altid udfyldt, så jeg kunne sammenligne dataændringer eller fejlfinde, hvis noget gik galt. Afhængigt af hvor lang tid -- trin 1 tager, kan det være hurtigere at udføre overførslerne omvendt end at genudfylde fra bunden.

Ligesom omdøb, kan du få skæve ting fra denne proces, såsom statistikker, der går tabt, når de bevæger sig med den faktiske tabel, de holder ikke med navnet. Og ligesom omdøb, vil du gerne teste dette, og du vil måske lege med isolationsniveauer, f.eks. RCSI for at få adgang til rapporteringstabellen.



  1. Sådan angives en auto-incrementing (int) identitetskolonne ved hjælp af Fluent-NHibernate og MySQL

  2. Hvordan kontrolleres (eller endda indstilles) sortering i mdb (ms access) fil?

  3. Søg i mysql-tabel fra sidste række

  4. Hvordan kan sortering af objekter i buckets formuleres som gyldigt JPQL-udtryk?