2011-10-26 32 views
1

我有一个查询,如下所示: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,并且速度急剧增加。

我在修复这样的事情方面经验不是很丰富,我的最佳选择是什么?

+0

您可以将其中一个OR条件移动到“第二个”查询,然后将它们与UNION连接起来......优化程序首先无法解决这个问题通常是不寻常的。 – Randy

+0

可能值得一试..也许统计数据已过时,并且规划人员认为大部分行都是x或y,所以不打扰索引?我漫步,如果一个'EventID IN(...)'会更好吗? –

+0

除了答案之外,Table1和Table2的上下文是什么,它们的关系是什么,你试图从这个查询中得到什么......你的整体COUNT()只是给出一个没有任何上下文的数字,或者与会者。 – DRapp

回答

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 
1

首先,您应该重写您的查询以指定如何连接Table1,Table2和eventattendees。还要选择是否要指定用于在WHERE子句中或在JOIN关键字之后加入的列。在清理了一下之后,优化器可能会更好地选择合适的索引来使用。

如果仍然不起作用,你可以使用一个SQL提示指定要优化器使用索引:

为索引(IX_nameofindex)

0

不理解什么是Table 1和表2是,也不是在任何形状的加盟,你会得到一个笛卡尔结果

此外,您的where子句可以只用IN子句简化(在表1每条记录,将与表2中的每条记录加入)

where 
    eventsignup.EventID IN (Table1.Identifier, Table1.AttendanceLinkID)