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

Jaký je nejlepší způsob obnovení kumulativní tabulky při zatížení?

Způsob, jakým jsem to udělal v několika projektech, je použít dvě kopie tabulky v různých schématech. Takže něco jako:

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

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

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

Nyní vytvořte uloženou proceduru, která zkrátí a znovu naplní falešnou tabulku, a poté v transakci přesunete objekty mezi schématy.

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

Toto je pravděpodobně nejkratší doba, po kterou mohou uživatelé čekat na obnovení nových dat, aniž by je uprostřed čtení přerušili. (S NOLOCKem je spojeno mnoho problémů, které z něj dělají méně žádoucí alternativu, i když je pravda, že je snadné jej kódovat.) Pro stručnost/jasnost jsem vynechal zpracování chyb atd., a měl bych také zdůraznit, že pokud používáte skripty pro synchronizaci vašich databází, ujistěte se, že pojmenujete omezení, indexy atd. stejně v obou tabulkách, jinak budete polovinu času nesynchronizovaní. Na konci procedury můžete ZKRÁTIT novou tabulku fake.MySummary, ale pokud máte místo, rád tam data nechám, abych je mohl vždy porovnat s předchozí verzí.

Před SQL Server 2005 jsem použil sp_rename uvnitř transakce k provedení přesně stejné věci, ale protože to dělám v práci, byl jsem rád, že jsem přešel na schémata, protože když jsem to udělal, přestalo se vyplňovat nepotlačitelné varování z sp_rename nahoru mé protokoly historie SQL Server Agent.



  1. více instancí mysql

  2. Žádný takový soubor nebo adresář nebo Žádný takový hostitel není znám při spouštění migrací

  3. Je nesprávně vytvořeno omezení cizího klíče?

  4. Kam vložím ORDER BY v mém dotazu MYSQL