C# 以最佳性能将数据插入SQL server

C# 以最佳性能将数据插入SQL server,c#,.net,sql-server,stored-procedures,ado.net,C#,.net,Sql Server,Stored Procedures,Ado.net,我有一个密集使用DB(SQL Server)的应用程序 由于它必须有高性能,我想知道最快的方式插入到数据库记录。从执行时间的角度来看最快 我应该用什么 据我所知,最快的方法是创建存储过程并从代码(ADO.NET)调用它。 请让我知道是否有更好的方法或可能有其他一些做法来提高性能 大容量插入将是最快的,因为它的日志记录最少,也许您可以使用SqlBulkCopy类“视情况而定” 您要插入多少行 多久插入一次 同时还将进行哪些其他数据库操作 插入行是因为用户操作(单击按钮)还是因为某些外部刺激

我有一个密集使用DB(SQL Server)的应用程序

由于它必须有高性能,我想知道最快的方式插入到数据库记录。从执行时间的角度来看最快

我应该用什么

据我所知,最快的方法是创建存储过程并从代码(ADO.NET)调用它。
请让我知道是否有更好的方法或可能有其他一些做法来提高性能

大容量插入将是最快的,因为它的日志记录最少,也许您可以使用SqlBulkCopy类“视情况而定”

  • 您要插入多少行
  • 多久插入一次
  • 同时还将进行哪些其他数据库操作
  • 插入行是因为用户操作(单击按钮)还是因为某些外部刺激

根据你的更新,我认为你应该考虑除了简单代码之外的其他机制。查看SQL Server集成服务,它们针对批量数据库操作进行了优化。您可能需要的是一个简单的SSIS作业,它定期运行,以便对满足特定条件的所有“新”数据执行大容量插入。它将允许随着时间的推移进行修改,以便在必要时使用诸如暂存表或中间服务器之类的东西

请让我知道是否有更好的方法或可能有其他一些做法来提高性能

  • 不要为每条记录打开一个连接。请务必了解连接池通常如何阻止您无意中打开每个记录的一个连接
  • 如果可能,不要对每条记录打开一个事务。也不要让交易在不适当的时间段内进行
  • 考虑表设计:索引/约束很少且没有触发器的窄表
  • 如果你需要一个快速插入,因为你是一个Web应用程序,现在需要返回一个页面给你,或者你是一个WINFLASH应用程序,并且在UI线程上阻塞,考虑执行插入Asic或者在另一个线程上。
  • 如果需要一个快速插入来导入一百万行文件,请考虑做一个大容量插入。
  • 如果您只想存储数据,而不想查询数据。。。考虑使用基于文件的解决方案代替.< /LI>
      你算过了吗?2M/天=83k/小时=1388/分钟=23/秒


      SQL Server每秒23次插入不会让人感到汗流浃背。

      我想他不知道SQL Server有多快。他询问最快的插入,然后使用ADO.NET和存储过程。我想他只是担心如何最好地打开连接之类的问题。我说我们需要更多的要求。你能详细说明一下吗?我们这里说的是多少插页?为什么性能如此关键?场中有多少台服务器?您运行的是哪种磁盘?(如果只有一台SQL server和两个磁盘,请不要费心回答,因为我怀疑您的问题是绝对最快的集体插入记录的方式~我以前当然错了)目前有两台服务器G6 HP DL360。目前他们正在进行RAID,但我们计划在下个月将他们转移到SAN上。性能非常重要,因为我们预计服务的负载非常大,响应时间必须最短。每天的响应时间大约为2百万分钟,但明年的响应时间将增加。我正在开发gateway,以便在外部系统操作上插入行。该表主要用于存储事务。@Incognito:另一个问题是-插入是否需要实时进行。特别是,在请求插入行的时间和实际插入行的时间之间,您可以接受多大的延迟?我们希望它们是实时的,尽管可以接受5-10分钟的延迟。当然,我们可以缓存一些请求并批量运行它们,但在这种情况下,如果由于某些意外原因导致服务崩溃,就会有丢失数据的风险。@Incognito:我的经验并没有那个么深刻。我只在SQL Server上称自己为“中级”,然后只在偶数天内称自己为中级。;-)我们正在使用连接池。不幸的是,每次调用都必须打开事务,因为一旦响应发送给请求者,就必须保证插入记录。表上有最小的索引,并且没有事务。它是一个tcp服务器,在线程池中调用插入。批量插入不起作用,因为每次请求都必须执行插入。您可以建议的基于文件的解决方案。通常,由于阻塞问题,我们避免将数据存储在文件中。每次插入文件都会被锁定。这是假设它们在一天中均匀地进入。。。我想我们可以假设他们没有。当然,即使以10倍的速度,也没有问题。(我知道我正在对他的应用程序做一些假设。)是的,我相信SQL Server可以处理这个问题。但是考虑到它们将是高峰时间,服务负荷将在时间内增加…因此,我们希望将其设计为高负载,以避免将来的修改。