在这里,我面临着一个更具挑战性的问题,并像往常一样打开这个网站寻求帮助。
我有一个Web服务执行一些业务逻辑,最后将结果插入表中。如果我的应用程序处于最小负载状态,这可以正常工作。
现在当负载很重时,我的INSERT
SQL语句超时了。我增加了连接超时和命令超时。但问题是有太多线程调用相同的Web方法。为了给出一些提示,我在重载时的OPEN sql连接数量达到500+。仅供参考,我在每次命令后都关闭了我的连接。
现在我该怎么做才能在这里优化这个东西?
我打算将INSERT
数据存储在数据表中,并将此数据表存储在APPLICATION变量中。每两分钟后,将此数据表中的数据插入数据库。
你们这里有什么其他想法可以让我的生活顺利吗?
谢谢
修改
以下是更多详细信息,当我在管理工作室中运行插入查询
时SQL Server解析和编译时间: CPU时间= 0 ms,经过时间= 0 ms。
SQL Server解析和编译时间: CPU时间= 0 ms,经过时间= 11 ms。
表'IndexTable1'。扫描计数0,逻辑读取2,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。
表'IndexTable2'。扫描计数0,逻辑读取2,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。
表'fulltext_index_docidstatus_171147655'。扫描计数0,逻辑读取11,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。
表' MAINTABLE '。扫描计数0,逻辑读取28,物理读取4,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。
(1行受影响)
(1行受影响)
SQL Server执行时间: CPU时间= 0 ms,经过时间= 69 ms。
SQL Server解析和编译时间: CPU时间= 0 ms,经过时间= 0 ms。
SQL Server执行时间: CPU时间= 0 ms,经过时间= 0 ms。
答案 0 :(得分:2)
您可以使用专用线程将数据插入数据库。为每个插入语句打开一个新连接毫无意义,相反,您可以每隔几秒钟在大块中插入数据。该线程可以在专用调度程序甚至计时器上运行,您可以使用线程安全队列进行线程间通信。
答案 1 :(得分:1)
您是否考虑过获得合适的服务器?很抱歉,但你完全忽略任何硬件的方式使我觉得你的数据库服务器是一个 - “典型的低端托管机器”,它本质上不适合运行大量IO绑定的大量SQL负载,因此需要高端IO子系统。
答案 2 :(得分:0)
我知道这个问题没有简单的答案。首先,您的计划会遇到并发问题,您可能会尝试锁定数据表等,这可能会造成麻烦。
根据经验,我建议不要在应用程序和数据库服务器之间建立持久连接。但另一方面,您的开放连接数量为500+是不应该发生的。我认为这是你应该关注的事情。我猜你的交易很大,而且运行时间超过几秒钟。尽量减少它。我可以提供将数据写入一个非常简单的未处理数据库表,比如写日志。在定期运行的SQL作业中,从该表读取并并行处理它们。您甚至可以管理一个系统,当系统检测到负载时会延迟处理。
如果在一个给定点上有几个类似的插入查询,则无论上面的语句如何,都必须考虑System.Data.SqlClient.SqlBulkCopy类。
祝你好运。答案 3 :(得分:0)
这个问题的答案可能过于复杂
尝试弄清楚瓶颈在哪里 - 是@客户端还是@服务器端。
INSERT涉及多少索引以及表顶部是否有 hotspot - 这对于单分区自动增量主键表非常常见
插入时是否同时对表执行SELECT
您应该查看所有这些以及许多其他原因,以找出问题所在。
尝试在您的问题中提供更有价值的信息
答案 4 :(得分:0)
Ilya Kogan的回答似乎很合理,与你的回答是一致的。基本上按计划进行批量插入。请记住,这只有在您插入的信息本身不会在业务逻辑中用于响应新请求时才会起作用。 当您发出响应时,客户端将假定服务器中的状态发生任何变化,只要它决定发出第二个请求,就会出现2个问题:1)如果在响应客户端后出于某种原因会发生什么情况以后不插入该请求的结果? 2)如果在收到响应时客户端会以第一个请求的结果仍未保留的方式发出新请求会发生什么?应用程序将使用什么作为数据来处理第二个请求。 正如您所看到的,这个看似简单的解决方案可能会导致其他问题,但这一切都取决于您的Web服务的设计方式,特别是如果需要处理更多请求的每个请求的任何持久数据。