C# SQL插入性能改进

C# SQL插入性能改进,c#,sql,sql-server,database,performance,C#,Sql,Sql Server,Database,Performance,我正在编写一个应用程序,将设备的状态更新(GPS位置)记录到数据库中。更新以每个设备的设定间隔进行,当前为每3秒一次。我在SQLServer08中使用一个简单的表来存储每个更新 我注意到,在我的应用程序中,运行insert是一个缓慢的领域。这不是一个严重的减速,但值得注意。当然,我希望以尽可能高效的方式写入数据库。我有一个提高绩效的想法,正在寻求意见和建议,看看是否有帮助: 状态更新来自异步套接字线程。在我当前的实现中,数据库插入调用是从这个线程执行的。我想我可以创建一个队列来保存更新数据,套接

我正在编写一个应用程序,将设备的状态更新(GPS位置)记录到数据库中。更新以每个设备的设定间隔进行,当前为每3秒一次。我在SQLServer08中使用一个简单的表来存储每个更新

我注意到,在我的应用程序中,运行insert是一个缓慢的领域。这不是一个严重的减速,但值得注意。当然,我希望以尽可能高效的方式写入数据库。我有一个提高绩效的想法,正在寻求意见和建议,看看是否有帮助:

状态更新来自异步套接字线程。在我当前的实现中,数据库插入调用是从这个线程执行的。我想我可以创建一个队列来保存更新数据,套接字线程可以快速地将其更新添加到其中,然后继续它的工作。然后将有一个单独的线程,其唯一责任是检查更新队列并将更新插入数据库

基本上,整个过程都基于这样的假设,即从一个位置同时向数据库写入一组数据比在随机时间写入一行数据更有效。我的假设是正确的,还是偏离了基准?另外,在SQL端,是否有命令告诉它一次写入一组行,以提高写入性能

以下是将数据库写入的方式:

我在C#中使用LinqToSQL,因此对于每个插入,我首先创建一个DataContext实例。然后从DataContext对象调用一个存储过程,该过程插入位置更新。
该表在更新时按日期时间编制索引。

您查看过MSMQ(Microsoft消息队列(MSMQ))吗?在我看来,这似乎是一个值得一看的选项。

您看过MSMQ(Microsoft消息队列(MSMQ))了吗?在我看来,这似乎是一个可以查看的选项。

您可能需要查看的另一个方面是,您是否正在为每个插入设置和断开连接。仅此一点就可以提高性能,消除批处理的需要


您还希望表上的索引尽可能少。

您可能需要查看的另一个方面是您是否正在为每个插入设置和断开连接。仅此一点就可以提高性能,消除批处理的需要


您还希望表上的索引尽可能少。

这听起来是个好主意。为什么不试一试,看看它的表现如何?

听起来是个好主意。为什么不试一试,看看它是如何执行的呢?

在SQL方面,您希望了解一下是否使用了参数化查询

此外,批处理INSERT语句肯定会提高性能


连接管理也是关键,当然这取决于应用程序是如何构建的,以及它是否依赖于存在的连接。

在SQL方面,您希望了解一下是否使用了参数化查询

此外,批处理INSERT语句肯定会提高性能


连接管理也是关键,当然这取决于应用程序的构建方式以及是否依赖于存在连接。

是的,根据您的描述,分批插入通常比单独插入更快。每次插入都需要建立连接并传输数据包。如果你有一个小插页,它可以容纳一个数据包,你可以发行其中的三个,但是你也可以有三个插页,它们都足够小,可以容纳在一个数据包中,那么它会有所帮助


仅仅根据你的描述来量化它是困难的——你需要为此做测试。例如,如hova所建议的,如果您始终保持一个专用连接处于打开状态,那么您可能会看到较少的影响。

是的,根据您的描述,分批插入通常比单独插入更快。每次插入都需要建立连接并传输数据包。如果你有一个小插页,它可以容纳一个数据包,你可以发行其中的三个,但是你也可以有三个插页,它们都足够小,可以容纳在一个数据包中,那么它会有所帮助


仅仅根据你的描述来量化它是困难的——你需要为此做测试。例如,如hova所建议的,如果您始终保持一个专用连接处于打开状态,那么您可能会看到较少的影响。

看看SqlBulkCopy类-这允许您使用BCP非常快速地插入数据块


另外,确保索引是有效的。如果您对任何不按顺序增加的内容(整数、日期)拥有聚集索引,则当页面被填满时,您的性能将降低。

请查看SqlBulkCopy类-这允许您使用BCP非常快速地插入数据块


另外,确保索引是有效的。如果您对任何不按顺序增加的内容(整数、日期)拥有聚集索引,则当页面被填满时,您的性能会降低。

在收集数据以进行批量复制时,您不怕丢失数据吗

我也在写申请书。开始时,我必须从3,5k GPS设备写入数据。一台设备应该每分钟发送一次数据,但它可以发送得更快。设备的目标数量为10,5k

我也想知道如何插入性能。目前,我正在使用纯ADO.NET ICommand和存储过程将接收到的数据保存到每个数据包的db中。在我的测试服务器上(Xeon 3,4GHz和一个1TB硬盘-普通桌面;),现在需要1ms或更短的时间


@GRIMUS-我是否应该考虑是否会有更多的设备?

在收集数据进行批量复制时,您不怕丢失数据吗

我在写申请书