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不會處理了。所以很慢不知大家怎麼看
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不會處理了。所以很慢不知大家怎麼看
OR不是不会处理,而是让你的索引失效
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.='??'
然后试下建立复合索引
通常情况下, 用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, 那就需要返回记录最少的索引列写在最前面.