以最佳性能将数据插入SQL服务器

问题描述:

我有一个集中使用数据库(SQL Server)的应用程序。以最佳性能将数据插入SQL服务器

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

我应该使用什么?

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

+1

你能详细点吗?我们在这里谈论多少插页?为什么表现如此重要?场中有多少台服务器?你在运行什么类型的磁盘? (如果只有一个SQL服务器和只有两个磁盘,请不要打扰回答,因为我怀疑你的问题是集体插入记录的绝对最快的方式〜当然,我错了) – jcolebrand 2010-05-10 18:40:28

+0

目前有2个服务器G6 HP DL360他们。目前他们正在使用RAID,但我们计划在未来一个月内将它们转移到SAN上。性能非常重要,因为我们预计服务的负载会很大,响应时间必须最短。 – Incognito 2010-05-10 18:50:54

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

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

我们正在使用连接池。 不幸的是,每次调用都必须打开事务,因为一旦发送给请求者的响应必须被保证该记录被插入。 表中有最小的索引和没有事务。 它是一个tcp服务器,并在threadpool中调用插入。 批量插入将无法正常工作,因为每次请求都必须完成插入操作。 你可以建议作为基于文件的解决方案。通常我们避免因阻塞问题而将数据存储在文件中。对于每次插入文件,它都被锁定。 – Incognito 2010-05-10 19:04:31

批量插入是最快的,因为它是最低限度记录,也许你可以使用SqlBulkCopy类

+0

我认为他不明白SQL服务器的速度有多快。他询问最快的插入,然后使用ADO.NET和sprocs。我认为他只是担心如何最好地打开连接等。我说我们需要更多的要求。 – jcolebrand 2010-05-10 18:39:09

“这取决于”。

  • 你说插入多少行?
  • 它们插入的频率有多高?
  • 什么其他数据库操作将在同一时间?
  • 由于用户操作(单击按钮),还是由于某些外部刺激,是否插入行?

根据您的更新,我想你应该考虑的不是简单的代码的其他机制。研究针对批量数据库操作进行优化的SQL Server Integration Services。您可能需要的是一个简单的SSIS作业,该作业定期运行以对满足特定条件的所有“新”数据执行批量插入。这将允许随着时间的推移修改使用诸如临时表或中间服务器之类的东西,如果这应该证明是必要的。

+0

每天约为2百万人次,但明年会增加。我正在开发网关,以便将行插入到外部系统操作上。该表主要用于存储交易。 – Incognito 2010-05-10 18:44:49

+0

@Incognito:另一个问题是 - 插入是否需要实时发生。特别是,在请求插入行的时间与实际插入的时间之间可以接受多少延迟? – 2010-05-10 18:49:20

+0

我们期望它们是实时的,但5-10分钟延迟是可以接受的。 – Incognito 2010-05-10 18:55:25

你做完数学? 2M /天= 83k /小时= 1388 /分钟= 23 /秒。

在每秒23次插入SQL Server不会出汗。

+2

这是假设他们全天均匀进来......我想我们可以假设他们不会。 – 2010-05-11 01:03:14

+0

当然,但即使是10倍的速度,这也不成问题。 (我知道我在这里对他的应用程序做了一些假设。) – egrunin 2010-05-11 03:56:52

+0

是的,我相信SQL Server可以处理它。但考虑到他们将会是高峰时段,服务负荷会随着时间的推移而增加......所以我们希望将其设计为高负荷,以避免将来进行修改。 – Incognito 2010-05-11 04:12:58