我有一个正在运行的系统,其中数据定期插入到MS SQL DB中,并且Web应用程序用于向用户显示此数据。
在数据插入期间,用户应该能够继续使用DB,不幸的是我现在无法重新设计整个系统。每2小时插入40k-80k记录。
现在这个过程看起来像这样:
INSERT INTO MyTable(...) SELECT ... FROM #TempTable
我认为这种方法效率很低。我看到,插入阶段可以改进(批量插入?),但是如何将数据从临时表传输到目标呢?
答案 0 :(得分:2)
这是我们做了几次。将表重命名为TableName_A。创建一个调用该表的视图。创建第二个表,与第一个表完全相同(Tablename_B)。使用第一个数据填充它。现在设置导入过程以填充视图未调用的表。然后更改视图以调用该表。用户的总停机时间,几秒钟。然后重新填充第一个表。如果您可以截断并填充表格,那么实际上更容易,因为您不需要最后一步,但如果输入数据不是完全刷新,则可能无法实现。
答案 1 :(得分:1)
插入表格时无法避免锁定。即使使用BULK INSERT,这也是不可能的。
但是,在并发INSERT操作期间想要访问此表的客户端可以在将事务隔离级别更改为READ UNCOMMITTED时执行此操作,或者通过使用WITH NOLOCK选项执行SELECT命令来执行此操作。
INSERT命令仍将锁定表/行,但SELECT命令将忽略这些锁并读取未提交的条目。