sql >> Databáze >  >> RDS >> Sqlserver

Nejúčinnější způsob, jak přesunout řádky tabulky z jedné tabulky do druhé

Dalším řešením je použít více schémat a hrát switch-a-roo. Tuto metodu preferuji pouze proto, že jsem tento trik prováděl v práci a varovné hlášení o přejmenování objektu (které nelze potlačit) zaplňovalo mé protokoly historie. V zásadě potřebujete dvě další schémata (jedno pro dočasné uložení kopie tabulky a druhé pro uložení kopie uložené v mezipaměti).

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

Nyní vytvořte napodobeninu tabulky ve schématu mezipaměti:

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

Nyní, když přijde čas na obnovení dat:

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

Teoreticky byste mohli přesunout poslední převod z transakce, protože uživatelé mohli začněte se dotazovat na novou kopii dbo.table po druhém přenosu, ale jak jsem řekl, je to téměř okamžité, takže by mě překvapilo, kdyby jste viděli nějaký rozdíl v souběžnosti.

Můžete také volitelně zkrátit cache.table znovu zde, ale vždy jsem to nechal vyplněné, abych mohl porovnávat změny dat nebo odstraňovat problémy, pokud se něco pokazilo. V závislosti na tom, jak dlouho -- krok 1 trvá, může být rychlejší provést převody obráceně, než je znovu naplnit od začátku.

Stejně jako přejmenování můžete z tohoto procesu získat podivné věci, jako je ztráta statistik, když se pohybují se skutečnou tabulkou, nedrží se jména. A stejně jako přejmenování, budete to chtít vyzkoušet a možná si budete chtít pohrát s úrovněmi izolace, např. RCSI pro přístup k tabulce hlášení.



  1. Echo v syntaxi heredoc / nowdoc

  2. pochopení tipů šipek v diagramu EER MySQL Workbench

  3. Ovládání ListView Zpracování událostí přetažením

  4. Který DATATYPE je lepší použít TEXT nebo VARCHAR?