我正在编写一个应用程序,用于将状态更新(GPS位置)从设备记录到数据库。更新以每个设备的设定间隔发生,目前每3秒一次。我在SQL Server 08中使用一个简单的表来存储每个更新。
我注意到在我的应用程序中运行插入是一个缓慢的领域。它不是一个严重的减速,但显而易见。当然,我想尽可能以有效的方式写入数据库。我有一个想法,以提高性能,我正在寻找输入和建议,看看它是否会有所帮助:
状态更新来自异步Socket线程。在我当前的实现中,数据库插入调用是从该线程执行的。我想我可以创建一个队列来保存更新数据,Socket线程可以快速添加其更新,然后继续它的快乐方式。然后会有一个单独的线程,其唯一的责任是检查更新队列并将更新插入数据库。
基本上,整个过程基于这样的假设:从一个位置一次写入一堆数据到数据库比在随机时间写一行数据更有效。我的假设是正确的,还是偏离基础?另外,在SQL方面,是否有一个命令告诉它一次写一堆行来提高写入性能?
这是数据库的写入方式:
我在C#中使用LinqToSQL,因此对于每个插入,我首先创建一个DataContext实例。然后,从DataContext对象中调用一个插入位置更新的存储过程。 对于更新时间,该表由datetime索引。
答案 0 :(得分:2)
查看SqlBulkCopy类 - 这允许您使用BCP非常快速地插入数据块。
另外,请确保您的索引有效。如果您对任何不按顺序增加的内容(整数,日期)都有聚簇索引,那么当页面填满时,您的性能会下降。
答案 1 :(得分:1)
您是否看过MSMQ(Microsoft消息队列(MSMQ))?在我看来,这是一个看看的选择。
答案 2 :(得分:1)
是的,批量插入通常比给出描述的单独插入更快。每个插入都需要建立连接并传输数据包。如果您有一个小插件需要一个数据包,而您发出其中三个,但是您可以选择三个插入,这些插入足够小以至于它们都可以放在一个数据包中,那么它将有所帮助。
根据您的描述量化很难 - 您需要为此进行测试。例如,如果您始终保持专用连接打开,正如hova建议的那样,那么您可能会看到更少的影响。
答案 3 :(得分:0)
您可能想要了解的另一个方面是您是否正在设置和拆除每个插入的连接。仅这一点就可以提高性能,无需批量处理。
您还希望在桌面上拥有尽可能少的索引。
答案 4 :(得分:0)
这听起来不错。为什么不试一试,看看它是如何表现的?
答案 5 :(得分:0)
在SQL端,您需要查看确保使用参数化查询。
批量处理INSERT语句肯定会提高性能。
连接管理也很关键,当然这取决于应用程序的构建方式以及是否依赖于连接。
答案 6 :(得分:0)
在收集批量复制数据时,您是否害怕丢失数据?
我正在编写应用程序。一开始我将不得不从3,5k GPS设备写入数据。一台设备应该每分钟发送一次数据,但它可以发送得更快。目的地设备数量为10,5k。
我也想知道插入性能。现在我使用纯ADO.NET ICommand和存储过程将每个数据包的接收数据保存到db。在我的测试服务器(Xeon 3,4GHz和一个1TB硬盘 - 普通桌面;)现在需要1ms或更短时间。
@GRIMUS - 我是否想知道是否会有更多设备?