Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MSSQL数据库中写入多个数据/行而不影响性能-C#_C#_Sql Server_Parallel Processing_Architecture_Database Performance - Fatal编程技术网

在MSSQL数据库中写入多个数据/行而不影响性能-C#

在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",

我有一个API,它接收一个大的JSON对象(至少7MB),这个JSON由一些嵌套对象组成,如下所示:

[
  {
    "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
    ,因此,我们可以在主数据库或
    tempdb
    中使用一些staging tables,然后,在插入/大容量复制之后,我可以拥有一个存储过程,该存储过程具有
    MERGE
    语句,该语句将把这些暂存表中的数据插入数据库中的主表。这里的主要挑战是,如果console应用程序同时处理多个请求/对象,这将是一个问题,因为在
    SqlBulkCopy
    期间,暂存表将被锁定,此外,在复制过程中,从该暂存表中删除索引会更好,以尽可能加快速度,但是在
    MERGE
    之前,我们应该有索引来加速从这些暂存表读取的过程。这里的挑战来自
    创建
    删除
    索引,这太难了,不推荐使用,特别是在两种情况下:(1)暂存表有大量数据(2)如果我开始创建索引作为
    合并的准备,但与此同时,另一个
    SqlBulkCopy
    正在并行处理另一个请求,该怎么办
问题是什么?它是关于应用程序架构的。。。 简单地说,我希望在数据库中执行编写过程,而不会影响数据库性能,也不会消耗app和db服务器的大量资源。此外,我想解决我在建议的场景中提到的挑战,如执行时间和在db和锁定表上的多次往返,而SqlBulkCopy在有并发请求的情况下

我只是想分享一下我的想法,但如果您对这个场景有更好的想法/实现,我完全愿意听取您的意见

注释

  • 我正在使用
    ADO.NET
    和存储过程来加速整个过程
  • 每个请求应在创建/发布后最多5-10分钟内写入数据库
  • 有时,我们可能会有多个请求,这些请求应该并行编写,从业务角度来看,顺序处理并不好

您已经很好地描述了您的场景,但我认为其中没有一个问题(当然没有问号)。如果你把这些问题分解成更具体的问题,你可能会得到更好的回答,否则很有可能会因为范围太广而被关闭。另外,您使用的是什么版本的SQL Server?现在将对其进行编辑,并提供更多说明…@GarethD我刚刚编辑了问题如果只是处理,我倾向于在您的数据库之外处理JSON,并将其解析为与您的数据库结构类似的表,然后,如果使用
OUTPUT
,则通过使用捕获自动生成的ID将这些数据表传递给存储过程来将数据保存到数据库中相当简单。如果使用此选项,将允许从源和目标捕获行,并有助于避免重复工作(例如,在一条语句中插入,然后在另一条语句中查找表以获取ID)