Начинът, по който направих това в няколко проекта, е да използвам две копия на таблицата в различни схеми. Така че нещо като:
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.