2011-10-26 38 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)