2013-05-07 62 views
-1

我有一个正在运行的系统,其中数据被定期插入到MS SQL DB中,并且Web应用程序用于向用户显示此数据。将数据插入MS SQL数据库而不锁定它的最快方法是什么?

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

眼下的过程是这样的:创建

  1. 临时表
  2. 数据使用普通的INSERT语句(参数化查询或存储proceuders应该提高速度)插入到它。
  3. 数据从临时表抽到使用INSERT INTO MyTable(...) SELECT ... FROM #TempTable

我认为这样的做法是非常低效的目标表。我看到,插入阶段可以改进(批量插入?),但是如何将数据从临时表传输到目标?

回答

2

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

+0

看来我已经在该表中有很多数据了。似乎复制它也需要一些时间。 – artvolk 2013-05-08 08:31:15

1

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

但是,希望在并发INSERT操作来访问此表可以这样做改变的事务隔离级别读取未提交或通过与使用NOLOCK选项执行SELECT命令时客户端。

INSERT命令仍然会锁定表/行,但随后的SELECT命令将忽略这些锁也未提交读条目。

相关问题