在MSSQL数据库中写入多个数据/行而不影响性能-C#
我有一个API,它接收一个大的JSON对象(至少7MB),这个JSON由一些嵌套对象组成,如下所示:在MSSQL数据库中写入多个数据/行而不影响性能-C#,c#,sql-server,parallel-processing,architecture,database-performance,C#,Sql Server,Parallel Processing,Architecture,Database Performance,我有一个API,它接收一个大的JSON对象(至少7MB),这个JSON由一些嵌套对象组成,如下所示: [ { "CategoryId": "P1", "CategoryName": "Pizza", "Products": [ { "ProductId": "PROD700", "ProductName": "Pepperoni Feast Large", "ProductPrice": "5.5",
[
{
"CategoryId": "P1",
"CategoryName": "Pizza",
"Products": [
{
"ProductId": "PROD700",
"ProductName": "Pepperoni Feast Large",
"ProductPrice": "5.5",
"Choices": [
{
"CoiceId": "CH22",
"ChoiceName": "Crust",
"Extras": [
{
"ExtraId": "EX1",
"ExtraName": "Classic Hand Tossed",
"ExtraPrice": "1"
},
{
"ExtraId": "EX2",
"ExtraName": "Crunchy Thin Crust",
"ExtraPrice": "1.25"
}
]
},
{
"CoiceId": "CH24",
"ChoiceName": "Additionals",
"Extras": [
{
"ExtraId": "EX3",
"ExtraName": "Extra Black Olives",
"ExtraPrice": "0.325"
},
{
"ExtraId": "EX4",
"ExtraName": "Extra Jalapeno",
"ExtraPrice": "0.4"
}
]
}
]
}
]
}
]
此API将接收JSON并将其保存在队列中,直到另一个后台服务(即控制台应用程序或windows服务)使用相同的API进行读取,并获取要写入数据库的挂起请求列表
事实上,这是一个非常简单的对象,但我只想分享这个对象的想法和结构,我有一个每秒流量巨大的单片数据库,因此,我有以下选择:
- 有一些嵌套的循环来在数据库中逐个保存上述数据,我认为这太糟糕了,它会因为很多往返而影响数据库性能,此外,要完成它需要很长的时间。
- 使用前面的场景,但是使用并行,因此,我们可以使用类似于
左右,我可以尽可能减少执行时间,但我们仍然存在许多数据库命中的问题并行的相同场景。对于
- 为了克服上述两个难题(执行时间和多个数据库命中),我考虑使用staging tables的概念以及
,因此,我们可以在主数据库或SqlBulkCopy
中使用一些staging tables,然后,在插入/大容量复制之后,我可以拥有一个存储过程,该存储过程具有tempdb
语句,该语句将把这些暂存表中的数据插入数据库中的主表。这里的主要挑战是,如果console应用程序同时处理多个请求/对象,这将是一个问题,因为在MERGE
期间,暂存表将被锁定,此外,在复制过程中,从该暂存表中删除索引会更好,以尽可能加快速度,但是在SqlBulkCopy
之前,我们应该有索引来加速从这些暂存表读取的过程。这里的挑战来自MERGE
和创建
索引,这太难了,不推荐使用,特别是在两种情况下:(1)暂存表有大量数据(2)如果我开始创建索引作为删除
合并的准备,但与此同时,另一个
正在并行处理另一个请求,该怎么办SqlBulkCopy
- 我正在使用
和存储过程来加速整个过程ADO.NET
- 每个请求应在创建/发布后最多5-10分钟内写入数据库
- 有时,我们可能会有多个请求,这些请求应该并行编写,从业务角度来看,顺序处理并不好
OUTPUT
,则通过使用捕获自动生成的ID将这些数据表传递给存储过程来将数据保存到数据库中相当简单。如果使用此选项,将允许从源和目标捕获行,并有助于避免重复工作(例如,在一条语句中插入,然后在另一条语句中查找表以获取ID)