Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Най-ефективният начин за преместване на редове от една таблица в друга

Друго решение е да използвате множество схеми и да играете switch-a-roo. Предпочитам този метод само защото използвах този трик в една работа и предупредителното съобщение за преименуване на обект (което не може да бъде потиснато) запълваше регистрационните ми файлове с история. По принцип ви трябват две допълнителни схеми (една за временно съхраняване на копие на таблицата и една за съхраняване на кешираното копие).

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

Сега създайте имитация на таблицата в схемата на кеша:

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

Сега, когато дойде време за опресняване на данните:

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

Теоретично можете да преместите последния трансфер извън транзакцията, защото потребителите могат започнете да правите заявки за новото копие на dbo.table след второто прехвърляне, но както казах, това е почти мигновено, така че ще се изненадам, ако видите някаква разлика в паралелността.

Можете също така по желание да съкратите cache.table отново тук, но винаги го поддържах попълнен, за да мога да сравня промените в данните или да отстраня неизправности, ако нещо се обърка. В зависимост от това колко време отнема -- стъпка 1, може да е по-бързо да извършите прехвърлянията в обратен ред, отколкото да попълните отново от нулата.

Подобно на преименуването, можете да получите странни неща от този процес, като статистиката да се загуби, докато се движи с действителната таблица, те не се придържат към името. И като преименуване, ще искате да тествате това и може да искате да си поиграете с нивата на изолация, напр. RCSI за достъп до отчетната таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изпълним SSIS пакет, когато файлът пристигне в папката

  2. Използване на CASE за връщане на низ, ако няма резултат от командата SELECT

  3. Еднопосочна синхронизация в реално време от sql-сървър към друго хранилище на данни

  4. Как да избера ТОП 5 ПРОЦЕНТА от всяка група?

  5. Търсене в SQL Management Studio 2005