Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist der beste Weg, um eine Rollup-Tabelle unter Last zu aktualisieren?

In einigen Projekten habe ich dies so gemacht, dass ich zwei Kopien der Tabelle in verschiedenen Schemas verwendet habe. Also sowas wie:

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

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

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

Erstellen Sie nun eine gespeicherte Prozedur, die die gefälschte Tabelle abschneidet und neu füllt, und verschieben Sie dann in einer Transaktion die Objekte zwischen den Schemas.

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

Dies ist wahrscheinlich die kürzeste Zeit, die Sie Benutzer auf die Aktualisierung der neuen Daten warten lassen können, ohne sie mitten in einem Lesevorgang zu stören. (Es gibt viele Probleme im Zusammenhang mit NOLOCK, die es zu einer weniger wünschenswerten Alternative machen, obwohl es zugegebenermaßen einfach zu codieren ist.) Der Kürze/Klarheit halber habe ich die Fehlerbehandlung usw. weggelassen, und ich sollte auch darauf hinweisen, wenn Sie es verwenden Skripte zum Synchronisieren Ihrer Datenbanken, stellen Sie sicher, dass Sie Einschränkungen, Indizes usw. in beiden Tabellen gleich benennen, da Sie sonst die Hälfte der Zeit nicht synchron sind. Am Ende des Vorgangs können Sie die neue fake.MySummary-Tabelle TRUNCATE, aber wenn Sie Platz haben, lasse ich die Daten gerne dort, damit ich sie immer mit der vorherigen Version vergleichen kann.

Vor SQL Server 2005 habe ich sp_rename innerhalb der Transaktion verwendet, um genau dasselbe zu erreichen, aber da ich dies in einem Job mache, war ich froh über den Wechsel zu Schemas, denn als ich das tat, hörte die nicht unterdrückbare Warnung von sp_rename auf zu füllen meine Verlaufsprotokolle des SQL Server-Agenten aktualisieren.