性能调整我的SQL查询删除OR语句

时间:2010-04-21 08:36:32

标签: sql sql-server-2005 performance

我需要通过删除“OR”语句来跟踪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
);

2 个答案:

答案 0 :(得分:1)

您确定这是您想要的查询吗?您确实知道第一个OR条件甚至没有定义连接,因此它将对所有表执行笛卡尔连接。我不确定这是否是按设计进行的,并且您不希望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。

答案 1 :(得分:0)

查看表结构非常有用 - 我相信你可以通过加入表来删除很多WHERE子句代码。