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

Кой е най-добрият начин за обновяване на сборна таблица при натоварване?

Начинът, по който направих това в няколко проекта, е да използвам две копия на таблицата в различни схеми. Така че нещо като:

CREATE SCHEMA fake WITH AUTHORIZATION dbo;
CREATE SCHEMA standby WITH AUTHORIZATION dbo;
GO

CREATE TABLE dbo.mySummary(<...columns...>);

CREATE TABLE fake.mySummary(<...columns...>);
GO

Сега създайте съхранена процедура, която съкращава и попълва отново фалшивата таблица, след което в транзакция преместете обектите между схемите.

CREATE PROCEDURE dbo.SwapInSummary
AS
BEGIN
    SET NOCOUNT ON;

    TRUNCATE TABLE fake.mySummary;

    INSERT fake.mySummary(<...columns...>)
        SELECT <expensive query>;

    BEGIN TRANSACTION;
        ALTER SCHEMA standby TRANSFER dbo.mySummary;
        ALTER SCHEMA dbo     TRANSFER fake.mySummary;
        ALTER SCHEMA fake    TRANSFER standby.mySummary;
    COMMIT TRANSACTION;
END
GO

Това вероятно е най-краткият период от време, който можете да накарате потребителите да чакат новите данни да бъдат опреснени и без да ги прекъсвате по средата на четенето. (Има много проблеми, свързани с NOLOCK, които го правят по-малко желана алтернатива, въпреки че трябва да се признае, че е лесен за кодиране.) За краткост/яснота съм пропуснал обработката на грешки и т.н. и трябва също да отбележа, че ако използвате скриптове за синхронизиране на вашите бази данни, уверете се, че наименувате ограничения, индекси и т.н. едни и същи на двете таблици, в противен случай няма да сте синхронизирани половината от времето. В края на процедурата можете да ОТРЕЖЕТЕ новата таблица fake.MySummary, но ако имате място, обичам да оставя данните там, за да мога винаги да сравня с предишната версия.

Преди SQL Server 2005 използвах sp_rename вътре в транзакцията, за да постигна точно същото нещо, но тъй като правя това на работа, се радвах, че преминах към схеми, защото когато го направих, предупреждението без възможност за потискане от sp_rename спря да се попълва моите регистрационни файлове за хронология на SQL Server Agent.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обединяване на множество бази данни в една база данни

  2. Актуализация с множество условия. SQL 2008

  3. Инсталирайте SQL Server 2019 на Mac

  4. Запазване на промените след редактиране на таблицата в SQL Server Management Studio

  5. Какво означава времеви печат в T-Sql в C#?