在不锁定数据的情况下将数据插入MS SQL数据库的最快方法是什么?

时间:2013-05-07 10:01:48

标签: sql-server bulkinsert

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

在数据插入期间,用户应该能够继续使用DB,不幸的是我现在无法重新设计整个系统。每2小时插入40k-80k记录。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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