截断表时无需等待

时间:2014-04-24 11:32:12

标签: sql ssis

我有一个SSIS包,1小时后重复运行。此包首先截断表,然后使用新数据填充该表。这个过程需要15-20分钟。运行此程序包时,用户无法使用数据。所以他们必须等到包完全运行。有没有办法处理这种情况,所以用户不必等待?

3 个答案:

答案 0 :(得分:2)

不要截断表格。而是添加一个包含日期数据类型的审计列,使用此审计列上的每小时分区对表进行分区,在新分区加载新数据后删除旧分区。

确保在审计列的帮助下将用户查询定向到正确的分区

答案 1 :(得分:1)

你可以做'A-B翻转'。

您可以使用两个表来完成工作,而不是截断面向客户端的表并重新加载它。

例如,如果有问题的表名为ACCOUNT:

  1. 将数据加载到名为STG_ACCOUNT
  2. 的表中
  3. 将ACCOUNT重命名为ACCOUNT_OLD
  4. 将STG_ACCOUNT重命名为ACCOUNT
  5. 将ACCOUNT_OLD重命名为STG_ACCOUNT
  6. 通过这样做,您可以最大限度地减少用户拥有空表的时间。

答案 2 :(得分:1)

这是非常危险的做法,但您可以将事务的隔离级别(我的意思是用户查询)从ReadCommitted / Serializable更改为ReadUncommitted。但是这个查询的行为很难预测。如果您的表正在使用SSIS包(插入/删除/更新)并且最终用户执行一些未提交的读取(例如SELECT * FROM Table1 WITH(NOLOCK)),则可以对某些行进行多次计数或错过。

如果用户只想阅读新小时数据'您可以尝试将隔离级别更改为“脏读”,但要小心!

如果他们可以处理前一小时的数据,Arnab会描述最佳解决方案,但分区仅在企业版中可用。如Zak所说,在其他SQL Server版本中使用重命名。

[更新]如果主要延迟(数十分钟,如你所说)是由复杂的计算引起的(而不是因为加载的行数!),你可以使用另一个表,如缓冲区。存储几行(数百,数千等),然后将它们重新加载到主表。因此,新数据将在没有“脏读”的情况下分批提供。技巧。