sql >> Database >  >> RDS >> Sqlserver

Meest efficiënte manier om tabelrijen van de ene naar de andere tafel te verplaatsen

Een andere oplossing is om meerdere schema's te gebruiken en switch-a-roo te spelen. Ik geef alleen de voorkeur aan deze methode omdat ik deze truc vroeger deed in een baan, en de waarschuwing over het hernoemen van een object (die niet kan worden onderdrukt) vulde mijn geschiedenislogboeken. In principe heb je twee extra schema's nodig (een om een ​​kopie van de tabel tijdelijk vast te houden en een om de kopie in de cache vast te houden).

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

Maak nu een nabootsing van de tabel in het cacheschema:

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

Als het nu tijd is om de gegevens te vernieuwen:

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

Theoretisch zou u de laatste overboeking uit de transactie kunnen halen, omdat gebruikers kunnen begin met het opvragen van de nieuwe kopie van dbo.table na de tweede overdracht, maar zoals ik al zei, dit is bijna onmiddellijk, dus het zou me verbazen als je enig verschil in gelijktijdigheid ziet.

U kunt eventueel ook cache.table afkappen nogmaals hier, maar ik hield het altijd gevuld, zodat ik gegevenswijzigingen kon vergelijken of problemen kon oplossen als er iets mis ging. Afhankelijk van hoe lang -- stap 1 duurt, kan het sneller zijn om de overdrachten in omgekeerde volgorde uit te voeren dan om helemaal opnieuw te vullen.

Net als hernoemen, kun je gekke dingen krijgen van dit proces, zoals statistieken die verloren gaan als ze met de eigenlijke tafel meebewegen, ze blijven niet bij de naam. En net als hernoemen, wil je dit uitproberen en misschien wil je spelen met isolatieniveaus, b.v. RCSI voor toegang tot de rapportagetabel.



  1. Hoe het maken van een MySQL-tabel van een groot CSV-bestand versnellen?

  2. 7 strategieën om het meeste uit uw vergaderingen te halen

  3. afstand tussen twee lengte- en breedtegraden

  4. gegevens van de ene tabel naar de andere verplaatsen, postgresql-editie