移动多个相关表

时间:2019-03-25 18:52:01

标签: sql-server

我有大约10个彼此相关的表。它们从单个平面文件填充,并且每天刷新。一些表包含原始数据,而某些表包含根据原始表计算出的分析结果。由于表中的数据是从单一来源填充的,并且它们相互关联,因此我们需要一种方法来同时或尽可能近地传输它们。当前,我们在临时模式中构建表,然后一次将它们转移到实时模式中。我担心的是,如果在表传输之间发生某种情况,并且其中一半表处于活动状态,而另一半处于暂存状态,将会发生什么。然后,数据将不匹配。我们希望全部或不转移。我想知道是否有人经历过类似的事情?是的,如何处理?

1 个答案:

答案 0 :(得分:0)

首先,是您最初的问题的答案;如何使数据传输全有或全无。

实际上,这很简单,因为您正在使用存储过程来进行数据传输。您可以将整个数据传输过程包装在一个显式事务中。这样,如果在此过程的中间发生任何事情,一切都会回滚。

因此,用一些伪代码:

BEGIN TRY

  BEGIN TRANSACTION

    INSERT Table1 ...
    SELECT ...
      FROM ...

    INSERT Table2 ...
    SELECT ...
      FROM ...

    ...

    INSERT TableN ...
    SELECT ...
      FROM ...

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

  ROLLBACK TRANSACTION
  --Other fancy error handling --

END CATCH;

此操作的缺点(可能会破坏交易)是,这将在所有表上保持表锁,直到完成整个传输为止。

提出第二点。分区切换。

对于这样的冲洗和填充,这可能是一个很好的解决方案。 ALTER TABLE...SWTCH通常在毫秒内执行。您仍然可以将SWITCH语句包装在显式事务中,但是由于所有操作都快得多,因此锁定的持续时间不会那么长。

BEGIN TRY

  BEGIN TRANSACTION

    ALTER TABLE staging.Table1 SWITCH PARTITION 1 TO live.Table1 ...

    ALTER TABLE staging.Table2 SWITCH PARTITION 1 TO live.Table2 ...

    ...

    ALTER TABLE staging.TableN SWITCH PARTITION 1 TO live.TableN ...

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

  ROLLBACK TRANSACTION
  --Other fancy error handling --

END CATCH;

肯德拉·利特尔(Kendra Little)撰写了一篇了不起的博客文章,深入探讨了如何在您的环境中使其尽可能无创地进入。

Why You Should Switch in Staging Tables Instead of Renaming Them