【问题标题】:Insert data into SQL server with best performance以最佳性能将数据插入 SQL Server
【发布时间】:2011-02-17 19:44:57
【问题描述】:

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

因为它必须具有高性能,所以我想知道将记录插入 DB 的最快方法。从执行时间的角度来看是最快的。

我应该使用什么?

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

【问题讨论】:

  • 您能详细说明一下吗?我们在这里谈论多少插入?为什么性能如此重要?场中有多少台服务器?你在什么类型的磁盘上运行? (如果只有一个 SQL 服务器和两个磁盘,请不要打扰回答,因为我怀疑您的问题是绝对最快的方式插入记录整体〜我之前当然错了)
  • 目前有 2 服务器 G6 HP DL360 他们。目前他们正在开发 RAID,但我们计划在下个月将它们转移到 SAN 上。性能非常重要,因为我们预计服务会承受巨大的负载,并且响应时间必须最短。

标签: c# .net sql-server stored-procedures ado.net


【解决方案1】:

批量插入将是最快的,因为它记录最少,也许您可​​以使用 SqlBulkCopy 类

【讨论】:

  • 我认为他不明白 SQL Server 的速度有多快。他询问最快的插入,然后使用 ADO.NET 和存储过程。我认为他只是担心如何最好地打开连接等。我说我们需要更多的要求。
【解决方案2】:

“视情况而定”。

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

根据您的更新,我认为您应该考虑简单代码以外的机制。查看针对批量数据库操作进行了优化的 SQL Server 集成服务。您可能需要一个简单的 SSIS 作业,该作业定期运行以对所有符合特定条件的“新”数据进行批量插入。如果有必要,它将允许随着时间的推移进行修改以使用临时表或中间服务器等东西。

【讨论】:

  • 每天大约 200 万,但来年会增加。我正在开发网关,因此将在外部系统操作中插入行。该表主要用于存储交易。
  • @Incognito:另一个问题是 - 插入是否需要实时发生。特别是,在请求插入行和实际插入之间,您可以接受多少延迟?
  • 我们希望它们是实时的,尽管可以接受 5-10 分钟的延迟。
  • 当然我们可以缓存一些请求,然后批量运行,但是这种情况下会因为一些意想不到的原因导致服务崩溃,有丢失数据的风险。
  • @Incognito:我的经验不是那么深刻。我只在 SQL Server 上称自己为“中级”,然后只在偶数天称自己为“中级”。 ;-)
【解决方案3】:

请告诉我是否有更好的方法,或者可能有其他一些做法可以提高性能。

  • 不要为每条记录打开一个连接。请了解连接池通常如何阻止您无意中为每条记录打开一个连接。
  • 如果可能,不要为每条记录打开一个事务。也不要让交易在不适当的时间内保持开放状态。
  • 考虑表设计:索引/约束很少且没有触发器的窄表。
  • 如果您需要快速插入,因为您是 Web 应用程序并且需要立即将页面返回给用户,或者您是 winform 应用程序并且在 UI 线程上阻塞,请考虑执行异步插入或在另一个线程上.
  • 如果您需要快速插入来导入一百万行文件,请考虑进行批量插入。
  • 如果您只想存储数据而不是查询数据...考虑改用基于文件的解决方案。

【讨论】:

  • 我们正在使用连接池。不幸的是,必须为每次调用打开事务,因为一旦将响应发送给请求者,就必须保证插入记录。表上有最少的索引并且没有事务。它是一个 tcp 服务器,插入在线程池中调用。批量插入将不起作用,因为必须对每个请求进行插入。您可以建议作为基于文件的解决方案。通常,由于阻塞问题,我们会避免将数据存储在文件中。每次插入文件都会被锁定。
【解决方案4】:

你算过吗? 2M/天 = 83k/小时 = 1388/分钟 = 23/秒。

以每秒 23 次插入的速度,SQL Server 不会出汗。

【讨论】:

  • 这是假设他们全天均匀地进来......我想我们可以假设他们没有。
  • 当然可以,但即使是这个速度的 10 倍也没有问题。 (我知道我在这里对他的申请做了一些假设。)
  • 是的,我相信 SQL Server 可以处理。但是考虑到它们将是高峰时段,服务负载会随着时间的推移而增加......所以我们希望将其设计为高负载以避免未来的修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2012-08-06
  • 2018-01-30
  • 2019-05-28
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多