我正在实施 A / B / View 方案,这意味着查看指向表A ,而表B 更新,然后发生切换,并且在加载表A时视图指向表B.
每天都会进行切换。有数百万行要更新,数千名用户正在查看该视图。我在SQL Server 2012上。
我的问题是:
答案 0 :(得分:3)
你可以做
SELECT fieldnames
INTO DestinationTable
FROM SourceTable
正如一对答案建议的那样,它应该尽可能快(取决于你需要重建的索引数量等)。
但我建议使用 synonyms 来将指针从一个表更改为另一个表。它们非常透明,在我看来,比更新视图或重命名表更清晰。
答案 1 :(得分:2)
您可以从SrcTable选择ColA,ColB到DestTable_New。加载DestTable_New后,重新创建索引和约束。
然后将DestTable重命名为DestTable_Old并将DestTable_New重命名为DestTable。重命名非常快。如果出现问题,您还可以通过(DestTable_Old)备份上一个表。
我曾经做过这种情况,我们必须让系统全天候运行并且每天需要加载数千万行。
答案 2 :(得分:1)
我倾向于使用SSIS。
使表A成为OLEDB源,表B成为OLEDB目标。您将绕过事务日志,以减少数据库的负载。使用T-SQL执行此操作的唯一方法(我能想到)是更改整个数据库的恢复模型,这远非理想,因为这意味着不存储任何事务,而不仅仅是传输事务。
设置SSIS转移
创建一个新项目并将数据流任务拖到设计图面
双击数据流任务,该任务将引导您进入“数据流”选项卡。然后从“数据流源”菜单中拖放OLE DB源,从“数据流目标”菜单中拖放OLE DB目标
双击OLE DB源,设置与服务器的连接,选择要加载的表,然后单击“确定”。将绿色箭头从OLE DB源拖动到目标,然后双击目标。设置连接管理器,目标表名称和列映射,你应该很高兴。
<强> OLE DB Source docs on MSDN 强>
答案 3 :(得分:1)
INSERT... SELECT...
功能与BULK INSERT
非常相似。您可以使用SSIS,就像@GarethD所说的那样,但如果您只是将行从table1复制到table2,那可能会过于复杂。
如果您要复制大量数据,请密切关注事务日志 - 在执行大量插入时,它会非常快速地膨胀。一种解决方法是通过循环一个插入语句来“插入”您正在插入的数据,例如,每次只处理100,000或10,000行(取决于行的宽度,即每遍的MB数)。
(只是好奇,你正在做ALTER VIEW
来重置视图吗?我做了类似的事情,虽然我们必须有四个表和四个视图来支持过去/现在/下一个/交换集。)
答案 4 :(得分:0)
你可以这样做
select * into A from B Where [criteria]
这将根据标准从B中选择数据并将其插入A中,前提是列相同或者您可以指定列名而不是*。
答案 5 :(得分:0)
我知道问题已经过时了,但我正在寻找同一个问题的答案,并没有找到任何真正有用的东西。是的SSIS方法是可能的,但问题需要存储过程。
令我高兴的是,我发现了(几乎)原始问题所需的解决方案;你可以用CLR SP做到这一点。
从TableA中选择数据到DataTable中,然后使用SqlBulkCopy类的WriteToServer(DataTable dt)方法,将TableB作为DestinationTableName。
唯一的缺点是CLR过程必须使用外部访问才能使用SqlBulkCopy,并且不能与上下文连接一起使用,因此您需要对权限和连接字符串进行一些操作。但是嘿!没有什么是完美的。