丄諦啲仇魜ヤ
如 果 敌 人 让 你 生 气 , 那 说 明 你 没 有 胜 他 的 把 握!
posts - 6,comments - 56,trackbacks - 1

36. 用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, 那就需要返回记录最少的索引列写在最前面. 


注意: 


WHERE KEY1 = 10 (返回最少记录) 

OR KEY2 = 20 (返回最多记录) 


ORACLE 内部将以上转换为 

WHERE KEY1 = 10 AND 

((NOT KEY1 = 10) AND KEY2 = 20) 

posted on 2007-09-27 19:04 Crying 阅读(213) 评论(0)  编辑  收藏 所属分类: 数据库

只有注册用户登录后才能发表评论。


网站导航: