1. 用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)
译者按: 下面的测试数据仅供参考: (a = 1003 返回一条记录 , b = 1 返回1003条记录)
SQL> select from unionvsor /1st test*/
2 where a = 1003 or b = 1;
1003 rows selected.

Execution Plan

0 SELECT STATEMENT Optimizer=CHOOSE
1 0 CONCATENATION
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

Statistics

0 recursive calls
0 db block gets
144 consistent gets
0 physical reads
0 redo size
63749 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1003 rows processed
SQL> select from unionvsor /2nd test*/
2 where b = 1 or a = 1003 ;
1003 rows selected.

Execution Plan

0 SELECT STATEMENT Optimizer=CHOOSE
1 0 CONCATENATION
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

0 recursive calls
0 db block gets
143 consistent gets
0 physical reads
0 redo size
63749 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1003 rows processed
SQL> select from unionvsor /3rd test*/
2 where a = 1003
3 union
4 select * from unionvsor
5 where b = 1;
1003 rows selected.

Execution Plan

0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (UNIQUE)
2 1 UNION-ALL
3 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)
5 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

0 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
63735 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1003 rows processed
用UNION的效果可以从consistent gets和 SQL*NET的数据交换量的减少看出

SQL优化常用方法36相关推荐

  1. SQL优化常用方法41

    用UNION-ALL 替换UNION ( 如果有可能的话) 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UN ...

  2. SQL优化常用方法31

    强制索引失效 如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录 数量少) . 举例: SELECT ENAME FROM EMP WHERE EM ...

  3. SQL优化常用方法49

    优化GROUP BY 提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.低效: SELECT JOB , AVG ...

  4. SQL优化常用方法24

    用EXPLAIN PLAN 分析SQL语句 EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表, ...

  5. SQL优化常用方法10

    删除重复记录 最高效的删除重复记录方法 ( 因为使用了ROWID) DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP ...

  6. SQL优化常用方法9

    整合简单,无关联的数据库访问 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 例如: SELECT NAME FROM EMP WHERE EMP_NO = 1 ...

  7. 52条实用经验,SQL优化不再难!

    " 不论是面试还是实际开发(后端),SQL 优化一直是绕不开的一个话题,本文会提到 52 条 SQL 语句性能优化策略. 图片来自 Pexels 有些优化策略需要你有一定的 SQL 实践才能 ...

  8. 学习笔记之-MySql高级之sql优化

    一 Mysql简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. M/SQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据 ...

  9. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

最新文章

  1. 设置行间距_[EndNote]如何修改文末参考文献行间距?
  2. linux 检测日志文件内容变化
  3. 谷歌大脑Wasserstein自编码器:新一代生成模型算法
  4. shell常见的文件属性检查
  5. EPSON 自带CCD图像处理包的典型应用框架
  6. 不改变原数组的一些方法
  7. 【Shell教程】四----输入输出,条件判断,循环
  8. 手机号正则_一起刷题学习正则表达式
  9. 用python读取excel文件观看节目的总时长_python读取excel所有数据(cmd界面)
  10. python中else与if的匹配原则是什么_if-else语句中,if和else的配对原则各是什么
  11. 注入dll到explorer.exe中无反应_【干货】制鞋大底生产中常见问题及解决
  12. java便利店库存管理系统_便利店库存管理系统可以做什么?
  13. 希捷硬盘保修时间查询
  14. pyautogui图形识别-confidence,grayscale
  15. 一大波能提高编程技能的游戏
  16. Bother, disturb and trouble 三个表示 “打扰” 的词语区分
  17. C语言:str函数(一)
  18. 全球及中国装配式建筑行业深度研究与发展模式咨询报告2022版
  19. zynq获取程序运行时间
  20. python带你成功复刻热门手机游戏——飞翔的小鸟

热门文章

  1. Redis 生产架构选型解决方案
  2. 一个基于SpringBoot + Mybatis + Vue的代码生成器
  3. Elasticsearch 在各大互联网公司大量真实的应用案例!
  4. 数据挖掘竞赛指南:曾经的数据挖掘少年,如今的阿里算法大佬
  5. 【廖雪峰python入门笔记】for循环
  6. 【廖雪峰python入门笔记】list添加元素_append()和insert()
  7. 清华大一Python作业太难上热榜!只上3节课,手撸AI算法,网友:离本科毕设只差一篇万字论文...
  8. 总结2021面试中的常见14种算法套路
  9. 北大毕业典礼上,一男博士求婚女硕士成功,网友直呼:科研人的爱情太甜了!...
  10. 神了!7行代码建起360亿的支付帝国