我的查询如下:
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,速度急剧增加。
我在改造这样的事情方面不是很有经验,这样做的最佳选择是什么?
答案 0 :(得分:1)
首先,您应该重写查询以指定Table1,Table2和eventattende如何连接。还要选择是否要在WHERE子句中或JOIN关键字后指定要用于连接的列。稍微清理一下后,优化器可以更好地选择正确的索引来使用。
如果仍然不起作用,您可以使用SQL提示指定希望优化程序使用的索引:
WITH INDEX(IX_nameofindex)
答案 1 :(得分:0)
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.AttendanceLinkID
union all
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
答案 2 :(得分:0)
不了解Table1和Table2是什么,也没有以任何形状连接,您将获得笛卡尔结果(对于Table1中的每条记录,将与表2中的每条记录连接)
此外,您的where子句可以使用IN子句进行简化
where
eventsignup.EventID IN ( Table1.Identifier, Table1.AttendanceLinkID )