BULK INSERT跨多个相关表?

问题描述 投票:0回答:2

我需要在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

然后,从应用程序代码中,我将使用以下逻辑对数据库进行五次调用:

  • 请求表中的X序列号,其中X是要插入表中的已知记录数。 (第一次DB呼叫。)
  • 从表B请求Y序列号,其中Y是要插入TableB的已知记录数(第二个DB调用。)
  • 使用现在已知的序列号修改A,B和C的现有对象(这些对象是为镜像表生成的模型)。
  • 批量插入TableA。 (第3次DB呼叫)
  • 批量插入表格。 (第4次DB呼叫)
  • 批量插入TableC。 (第5次DB呼叫)

然后,当然,我们总是加入序列。

我有三个问题:

  1. 我的基本逻辑是否正确?
  2. 在表B和C中,我是否会从PK中删除聚集索引并将其放入序列中?
  3. 一旦从表B和C请求序列号,它们是否以某种方式锁定在请求和批量插入之间?我只需要确保在请求和插入之间,其他一些进程不请求并使用相同的数字。

谢谢!

编辑:

在输入并发布后,我一直在深入阅读SEQUENCE文档。我想我起初误解了它。 SEQUENCE不是列类型。对于表中的实际列,我将使用INT(或者可能是BIGINT),具体取决于我期望的记录数。实际的SEQUENCE对象是一个完全独立的实体,其作用是根据请求生成数值并跟踪已生成的数值。所以,如果我理解正确的话,我会生成两个SEQUENCE对象,一个用于与表B一起使用,另一个用于表C.

所以这回答了我的第三个问题。

c# asp.net .net sql-server bulkinsert
2个回答
1
投票

我的基本逻辑是否正确?

是。这里另一种常见的方法是将数据批量加载到临时表中,并在服务器端执行类似的操作。

从客户端,您可以使用sp_sequence_get_range存储过程请求序列值范围。

在表B和C中,我是否会从PK中删除聚集索引

不,正如您稍后提到的那样,序列只​​为您提供PK值。


1
投票

对不起,请先阅读您的问题。我现在看到你正在尝试生成自己的PK而不是允许MS SQL为你生成它们。抓我的上述评论。

正如David Browne所提到的,您可能希望使用临时表来避免应用程序堆上的压力。使用tempdb并使用每个表的单个事务直接对表执行修改。然后,将登台表复制到其目标,或者如果追加则使用MERGE。如果要强制执行FK,如果选择以相反顺序插入(C => B => A),则可以临时删除这些约束。如果在插入期间遇到性能问题,您还可以考虑临时删除索引。最后,考虑使用SSIS而不是自定义应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.