2010-04-21 81 views
0

我需要進行性能調整通過刪除「或」語句性能優化我的SQL查詢,刪除或聲明

請幫助下面的SQL查詢...

SELECT a.id, a.fileType, a.uploadTime, a.filename, a.userId, a.CID, ui.username, company.name companyName, a.screenName 
FROM TM_transactionLog a, TM_userInfo ui, TM_company company, TM_airlineCompany ac 
WHERE 
(   
    a.CID = 3049 
) 
OR  
( 
    a.CID = company.ID 
    AND 
    ac.SERVICECID = 3049 
    AND 
    company.SPECIFICCID = ac.ID 
) 
OR 
(
    a.USERID = ui.ID 
    AND 
    ui.CID = 3049 
); 

回答

1

你確定這是你想要的查詢嗎?你知道第一個OR條件甚至沒有定義連接,所以它會在所有表上進行笛卡爾連接。我不確定這是否符合設計要求,並且您不希望在該條件下滿足連接條件。因爲它看起來像你的多表選擇列建議你期待某種形式的加入,如果是這樣的話,你應該先有自己的查詢,看起來像這樣..

SELECT a.id, 
     a.filetype, 
     a.uploadtime, 
     a.filename, 
     a.userid, 
     a.cid, 
     ui.username, 
     company.name companyname, 
     a.screenname 
FROM tm_transactionlog a, 
     tm_userinfo ui, 
     tm_company company, 
     tm_airlinecompany ac 
WHERE a.userid = ui.id 
     AND a.cid = company.id 
     AND company.specificcid = ac.id 
     AND (a.cid = 3049 
       OR ac.servicecid = 3049 
       OR ui.cid = 3049); 

並儘可能優化這查詢,我認爲在不改變數據模型的情況下,可以做的很少。如果你已經沒有索引了,我會建議在(a.userid,a.cid < - 具有較高基數的列應該先進行)上創建一個複合索引,以及在ac.cservicecid,company.specificcid & ui上的索引.cid。

0

這將是看錶真正有用結構 - 我相信你可以通過加入你的表來刪除大量的WHERE子句代碼。