我需要在3个表中进行数十万条记录的BULK INSERT。表格的简单分类如下:
TableA
--------
TableAID (PK)
TableBID (FK)
TableCID (FK)
Other Columns
TableB
--------
TableBID (PK)
Other Columns
TableC
--------
TableCID (PK)
Other Columns
当然,批量插入的问题在于它只适用于一个表,因此FK成为一个问题。
我一直在四处寻找解决这个问题的方法,从我从各种来源收集的信息来看,使用SEQUENCE column可能是最好的选择。我只是想确保我已经正确地拼凑了我读过的各种线程和帖子的逻辑。如果我有正确的想法,请告诉我。
首先,将表修改为如下所示:
TableA
--------
TableAID (PK)
TableBSequence
TableCSequence
Other Columns
TableB
--------
TableBID (PK)
TableBSequence
Other Columns
TableC
--------
TableCID (PK)
TableCSequence
Other Columns
然后,从应用程序代码中,我将使用以下逻辑对数据库进行五次调用:
然后,当然,我们总是加入序列。
我有三个问题:
谢谢!
编辑:
在输入并发布后,我一直在深入阅读SEQUENCE文档。我想我起初误解了它。 SEQUENCE不是列类型。对于表中的实际列,我将使用INT(或者可能是BIGINT),具体取决于我期望的记录数。实际的SEQUENCE对象是一个完全独立的实体,其作用是根据请求生成数值并跟踪已生成的数值。所以,如果我理解正确的话,我会生成两个SEQUENCE对象,一个用于与表B一起使用,另一个用于表C.
所以这回答了我的第三个问题。
我的基本逻辑是否正确?
是。这里另一种常见的方法是将数据批量加载到临时表中,并在服务器端执行类似的操作。
从客户端,您可以使用sp_sequence_get_range存储过程请求序列值范围。
在表B和C中,我是否会从PK中删除聚集索引
不,正如您稍后提到的那样,序列只为您提供PK值。
对不起,请先阅读您的问题。我现在看到你正在尝试生成自己的PK而不是允许MS SQL为你生成它们。抓我的上述评论。
正如David Browne所提到的,您可能希望使用临时表来避免应用程序堆上的压力。使用tempdb并使用每个表的单个事务直接对表执行修改。然后,将登台表复制到其目标,或者如果追加则使用MERGE。如果要强制执行FK,如果选择以相反顺序插入(C => B => A),则可以临时删除这些约束。如果在插入期间遇到性能问题,您还可以考虑临时删除索引。最后,考虑使用SSIS而不是自定义应用程序。