我有一个查询,如下所示:SQL“或” where子句中造成使用上没有索引
SELECT COUNT(Table1.Identifier) AS NonCancelCnt
FROM Table1, Table2
LEFT JOIN eventattendees ON eventattendees.AttendeeID = 47322
LEFT JOIN eventsignup ON eventattendees.AttendeeID = eventsignup.AttendeeID
LEFT JOIN transactions on transactions.registrationID=eventsignup.regid
WHERE ((eventsignup.EventID = Table1.Identifier) Or (eventsignup.EventID = Table1.AttendanceLinkID))
的“OR”子句导致没有索引使用。如果我删除任何一部分,我的执行路径从95,000到200,并且速度急剧增加。
我在修复这样的事情方面经验不是很丰富,我的最佳选择是什么?
您可以将其中一个OR条件移动到“第二个”查询,然后将它们与UNION连接起来......优化程序首先无法解决这个问题通常是不寻常的。 – Randy
可能值得一试..也许统计数据已过时,并且规划人员认为大部分行都是x或y,所以不打扰索引?我漫步,如果一个'EventID IN(...)'会更好吗? –
除了答案之外,Table1和Table2的上下文是什么,它们的关系是什么,你试图从这个查询中得到什么......你的整体COUNT()只是给出一个没有任何上下文的数字,或者与会者。 – DRapp