我目前正在开发电话目录应用程序。对于这个应用程序,我从公司SAP获得一个平面文件(csv),每天更新一次,我用它来使用Windows服务每天更新一次sql数据库。此外,如果用户不存在,用户可以将自己添加到数据库中(即:不包括在SAP文件中)。因此,联系人可以有两种不同的类型:'SAP'或'ECOM'。
因此,Windows服务从SAP ftp下载文件,删除“SAP”类型的数据库中的所有现有联系人,然后将文件中的所有联系人添加到数据库。要将联系人插入数据库(大约30k),我将它们加载到DataTable
然后使用SqlBulkCopy。这特别有效,只运行几秒钟。
唯一的问题是此表的主键是自动递增的标识。这意味着我的联系人ID以每天6万的速度增长。我还在开发中,我的身份在20mil的范围内:
http://localhost/CityPhone/Contact/Details/21026374
我开始研究重新种植id列,但是如果我将身份重新设置为数据库中当前最高的数字,则以下情况会产生问题:
另外,我经常根据这个id查询用户,所以,我担心使用像GUID而不是自动递增的整数这样的东西会有太高的性价比。我也试过调查SqlBulkCopyOptions.KeepIdentity
,但这不起作用。我没有在文件中获得SAP的任何ID,如果我这样做,他们很容易与手动输入的联系人字段的值冲突。是否有任何其他解决方案来重新安排不会导致id列值以这种指数速率增长的列?
答案 0 :(得分:1)
我建议遵循以下工作流程。
仅向表中添加已更改的行。
Insert Into ContactDetails
(Select *
from tempSAPImport
EXCEPT
SELECT Detail1, Detail2
FROM ContactDetails)
我认为您的SAP表有一个主键,如果只更新了行,您可以使用该控件。
Update ContactDetails ( XXX your update criteria)
这样您就可以快速导入数据,也可以保留现有的身份值。根据您的速度要求,导入后添加索引将加快您的流程。
答案 1 :(得分:1)
如果SQL Server版本> = 2012,那么我认为上述场景的最佳解决方案是使用PK值的序列。通过这种方式,您可以控制播种过程(可以循环使用值)。
此处有更多详情:http://msdn.microsoft.com/en-us/library/ff878091(v=sql.110).aspx