证明查询是阻塞问题

时间:2015-09-01 16:28:29

标签: sql sql-server tsql sql-server-2008-r2

运行此查询时,到目前为止可能会发生4种不同的结果,但频率最高的主要结果是它在我杀死它之前运行超过10分钟,但大约1%的时间会返回2条记录或3条记录或无记录:

select *
from [master] as [p]( nolock )
     inner join eddd(nolock) as [e]
     on [p].[guid] = [e].pggg
     inner join stppp as [s]( nolock )
     on [e].[guid] = [s].evggg
     inner join [edddex] as [x]( nolock )
     on [e].[guid] = [x].[guid]
where [p].[guid] = '370ECB0F-6222-4D02-86DD-336BAAA49B81'
  and ( CAST([s].rddd as date) = '20150821'
     or CAST([s].rddd as date) = '20150821' )
  and [s].[st111num] = 4
  and [e].[ev111type] = 6
  and [x].[l11105] = 6;

我的朋友辩称,因为删除了这个过滤器:

  and ( CAST([s].rddd as date) = '20150821'
     or CAST([s].rddd as date) = '20150821' )

导致查询立即响应,这证明这不是阻塞/锁定问题。

当只对特定数据库进行SELECT访问且无法审核或查看系统表时,如何确定特定查询是否因锁定而返回不同的结果?

1 个答案:

答案 0 :(得分:0)

CAST([s] .rddd是性能问题。当您在条件字段周围放置一个函数(如CAST(),MAX()等)时,您将禁用索引,否则该索引将有助于执行您的查询,这会导致全表扫描。修改您的查询,以便您可以避免使用此类函数,并确保您的过滤器/匹配涉及LEADING索引字段。不使用前导索引字段也导致indexe(s)不使用。

要获得更多信息,请运行EXPLAIN PLAN(显示计划......无论您使用哪种系统),它都会告诉您使用了哪些索引等等。

此外,.... SELECT *是一个性能杀手,因为它必须返回所有字段,所以即使索引可以帮助过滤,也必须完全读取包含任何所需记录的每个块。 SELECT *很少需要,所以也请访问它并将其修剪为仅需要的字段。