我正在从麻烦的查询中查看执行计划。
我可以看到45%的计划被用于对包含七(7)行数据的表进行表扫描。
我准备使用聚簇索引覆盖查询中包含七行的表中的列,感觉......错误。鉴于表格如此之小,我的查询部分如何占用这么多计划呢?
我正在阅读here并且感觉它可能只是因为非连续数据 - 所讨论的表中根本没有索引。总的来说,虽然我们的数据库是大型(7GB)并且很忙。
我很想知道别人的想法 - 谢谢!
编辑:
查询运行频繁且涉及死锁(并选择作为受害者)。现在它需要300毫秒到500毫秒才能运行,但是当数据库更加繁忙时需要更长的时间。
查询:
select l.team1Score, l.team2Score, ls.team1ExternalID, ls.team2ExternalID, et.eventCategoryID, e.eventID, ls.statusCode
from livescoretracking l(nolock)
inner join liveScores ls (nolock) on l.liveScoreID = ls.liveScoreID
inner join db1.dbo.events e on e.gameid = ls.gameid
inner join db1.dbo.eventtype et (nolock) on e.eventTypeID = et.eventTypeID
inner join eventCategoryPayTypeMappings ecb (nolock) on ( et.eventCategoryID = ecb.eventCategoryID and e.payTypeID = ecb.payTypeID and ecb.mainEvent = 1 )
where ls.gameID = 286711 order by l.dateinserted
问题表是 eventCategoryPayTypeMappings 表 - 谢谢!
答案 0 :(得分:1)
七行表上的表扫描并不昂贵。除了查询提示之外,无论存在什么索引,查询引擎都会在这么小的表上使用表扫描。您能否向我们展示有关查询的更多信息以及执行计划的问题?
答案 1 :(得分:1)
如果不了解实际总成本,百分比成本毫无意义。例如如果查询需要1毫秒来执行表扫描的45%成本是.45毫秒,这不值得尝试优化,如果查询需要10秒执行,那么45%的成本是重要的,值得优化。 / p>
答案 2 :(得分:1)
如果表上没有索引,查询引擎总是必须进行表扫描。没有其他方法可以处理数据。
即使是索引,许多RDBMS平台也会在表上进行表扫描。 (我不确定SQL Server。)
我会更关心查询计划中的实际数字。
答案 3 :(得分:1)
死锁通常更多地表示资源访问排序问题,尤其是查询设计问题。我会查看死锁中的其他参与者,并查看每个事务锁定的对象是否是其他对象所需的对象。如果您可以重新排序以确保一致的访问顺序,则可以完全避免争用问题。
答案 4 :(得分:0)
这实际上取决于查询从头到尾需要多长时间。 45%并不意味着如果查询只花费10毫秒就会花费很长时间。所有它真正说的是大部分时间花在做表扫描上,这是可以理解的。
有一个索引可能有助于表增长,除非你知道这个表不会增长,否则可能不是一个坏主意。但是,您会发现向具有7条记录的表添加索引对性能几乎没有差别。
答案 5 :(得分:0)
对小表进行表扫描并不是件坏事 - 如果它适合单次读入缓存,优化器将计算出表扫描的成本低于读取索引链的成本。
我只推荐聚集索引,如果你想帮助确保内容“倾向于”以这种方式排序(尽管你需要明确的顺序来保证)。