1.
SELECT * FROM A
LEFT JOIN B ON a=b
LEFT JOIN C ON a=c
WHERE B.='??'2.
SELECT * FROM A
LEFT JOIN B ON a=b
LEFT JOIN C ON a=c
WHERE C.='??'3.
SELECT * FROM A
LEFT JOIN B ON a=b
LEFT JOIN C ON a=c
WHERE (B.='??' or C.='??')現象:上面1,2執行都很快,3很慢。把 1,2用 union聯起來也很快
想請教一下原因,謝謝大家我的一點想法是:
1,2條件,相當於內聯了。所以快。但3的 or讓sql server不會處理了。所以很慢不知大家怎麼看

解决方案 »

  1.   

    ...union或者两个字段都加索引
      

  2.   

    用UNION ALL或者联合索引吧,应该能行的,
    OR不是不会处理,而是让你的索引失效
      

  3.   

    SELECT col1,col2,col2,col... FROM A 
    LEFT JOIN B ON a=b 
    LEFT JOIN C ON a=c 
    WHERE B.='??' 
    union all 
    SELECT col1,col2,col2,col...  FROM A 
    LEFT JOIN B ON a=b 
    LEFT JOIN C ON a=c 
    WHERE C.='??' 
    然后试下建立复合索引
      

  4.   

    用UNION 替换OR (适用于索引列)
    通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
    成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column 没有被索引, 查询效
    率可能会因为你没有选择OR 而降低. 在下面的例子中, LOC_ID 和REGION 上都建有索引.
    高效:
    SELECT LOC_ID , LOC_DESC , REGION
    FROM LOCATION
    WHERE LOC_ID = 10
    UNION
    SELECT LOC_ID , LOC_DESC , REGION
    FROM LOCATION
    WHERE REGION = “MELBOURNE”
    低效:
    SELECT LOC_ID , LOC_DESC , REGION
    FROM LOCATION
    WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
    如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
      

  5.   

    条件用OR,只要有一个字段没有索引,将用不到索引. 所以需要OR涉及到的字段都加索引