我们具有相对较高的SQL数据库负载信息,该数据库托管在Azure云上。要计算用户帐户的余额,我们每次都会汇总所有支出(entry
表)。我知道我们可以采取不同的方法,但是即使在entry
表的情况下,当前的解决方案在绝对多数情况下也能很好地工作,并且HTTP平衡请求平均大约需要134毫秒(这不仅包括有问题的查询)。包含数千亿行(我们有很多帐户,每个帐户没有那么多操作)。
我们的 SQL (在NHibernate之后稍微美化了-删除了列和表别名)
select AccountId, cast(sum(Amount) as DECIMAL(19,5)) as Balance
from entry
where not (Locked=1) and (AccountId in (@p0))
group by AccountId
快速执行查询的执行计划(不确定是否有帮助): 因此查询使用的索引包括AccountId,Locked以及之后的另外两列。
通常执行时间少于 100毫秒,但有时( 1个〜1000个请求)会挂起 30+秒< / strong>,并且在超时时失败。
我尝试使用sp_who2
存储过程查找死锁,但未找到任何结果-即使我尝试了很多次并且在此期间不断抛出异常,它也没有显示任何阻塞的查询。 / p>
有趣的是,我们每分钟有数百种此类请求,但失败是一一发生的,因此两次例外之间的间隔至少为30秒,并且是30的倍数(30、60、90, 120秒-最常见的是30秒和60秒)。我无法解释这一点,但我想有些工作我不知道,它以单线程运行并阻止了特定帐户。但是我怎么找到它呢?