-1

我有一个正在运行的系统,其中数据会定期插入 MS SQL DB,并且 Web 应用程序用于向用户显示这些数据。

在数据插入期间,用户应该可以继续使用 DB,可惜我现在不能重新设计整个系统。每 2 小时插入 40k-80k 条记录。

现在这个过程看起来像这样:

  1. 临时表已创建
  2. 使用普通的 INSERT 语句将数据插入其中(参数化查询或存储的处理程序应该会提高速度)。
  3. 使用以下命令将数据从临时表泵送到目标表INSERT INTO MyTable(...) SELECT ... FROM #TempTable

我认为这种方法效率很低。我明白了,可以改进插入阶段(批量插入?),但是将数据从临时表传输到目标呢?

4

2 回答 2

2

这是我们做过几次的事情。将您的表重命名为 TableName_A。创建一个调用该表的视图。创建与第一个完全相同的第二个表 (Tablename_B)。用第一个数据填充它。现在设置您的导入过程以填充视图未调用的表。然后更改视图以调用该表。用户的总停机时间,几秒钟。然后重新填充第一个表。如果您可以截断并填充表格,实际上会更容易,因为您不需要最后一步,但如果您的输入数据不是完全刷新,这可能是不可能的。

于 2013-05-07T13:38:23.460 回答
1

插入表格时无法避免锁定。即使使用 BULK INSERT 也是不可能的。

但是,想要在并发 INSERT 操作期间访问此表的客户端可以在将事务隔离级别更改为 READ UNCOMMITTED 或执行带有 WITH NOLOCK 选项的 SELECT 命令时这样做。

INSERT 命令仍将锁定表/行,但 SELECT 命令将忽略这些锁定并读取未提交的条目。

于 2013-05-07T12:50:50.423 回答