从c#到SQL Server的批量插入策略

Pra*_*tic 7 c# sql-server bulkinsert sqlbulkcopy

在我们当前的项目中,客户将向我们的系统发送复杂/嵌套消息的集合.这些消息的频率约为.1000-2000 msg /每秒.

这些复杂对象包含事务数据(要添加)以及主数据(如果未找到则将添加).但客户不是传递主数据的ID,而是传递"名称"列.

系统检查这些名称是否存在主数据.如果找到,它将使用数据库中的ID,否则首先创建此主数据,然后使用这些ID.

解析主数据ID后,系统会将事务数据插入SQL Server数据库(使用主数据ID).每条消息的主实体数量约为15-20.

以下是我们可以采取的一些策略.

  1. 我们可以首先从C#代码中解析master ID(如果没有找到则插入主数据)并将这些id存储在C#cache中.解决所有ID后,我们可以使用SqlBulkCopy类批量插入事务数据.我们可以访问数据库15次以获取不同实体的ID,然后再次命中数据库以插入最终数据.我们可以使用相同的连接在完成所有这些处理后关闭它.

  2. 我们可以将包含主数据和事务数据的所有这些消息一次性发送到数据库(以多个TVP的形式),然后在内部存储过程中,首先为缺失的数据创建主数据,然后插入事务数据.

有人可以建议这个用例的最佳方法吗?

由于一些隐私问题,我无法分享实际的对象结构.但这是假设的对象结构,它非常接近我们的业务对象.

其中一条消息将包含有关一个产品(其主数据)的信息以及来自不同供应商的价格详细信息(交易数据):

主数据(如果未找到则需要添加)

产品名称:ABC,ProductCateory:XYZ,制造商:XXX和其他一些细节(属性数量在15-20范围内).

交易数据(将始终添加)

供应商名称:A,ListPrice:XXX,折扣:XXX

供应商名称:B,ListPrice:XXX,折扣:XXX

供应商名称:C,ListPrice:XXX,折扣:XXX

供应商名称:D,ListPrice:XXX,折扣:XXX

对于属于一个产品的消息,大多数有关主数据的信息将保持不变(并且将更改频率更低),但事务数据将始终波动.因此,系统将检查系统中是否存在产品"XXX".如果没有,请检查本产品中提到的"类别"是否存在.如果没有,它将为类别插入新记录,然后为产品插入.这将针对制造商和其他主数据进行.

多个供应商将同时发送有关多个产品(2000-5000)的数据.

因此,假设我们有1000个供应商,每个供应商都在发送大约10-15种不同产品的数据.每2-3秒后,每个供应商都会向我们发送这10个产品的价格更新.他可能会开始发送有关新产品的数据,但这种情况并不常见.

rdu*_*com 0

从数据库的角度来看,没有比批量插入(例如从 csv 文件)更快的事情了。最好的方法是尽快批量处理所有数据,然后使用存储过程对其进行处理。

C# 层只会减慢这个过程,因为 C# 和 SQL 之间的所有查询都会比 Sql-Server 直接处理的慢数千倍。