Oracle 建立索引及SQL优化

数据库索引:

索引有单列索引
复合索引之说

如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。

建设原则:

 1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。

 2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。

 3、不应该在小表上建设索引。

优缺点:
 1、索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。

创建索引:
 单一索引:Create Index <Index-Name> On <Table_Name>(Column_Name);

 复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。

  select * from emp where deptno=66 and job='sals' ->走索引。

  select * from emp where deptno=66 OR job='sals' ->将进行全表扫描。不走索引

  select * from emp where deptno=66 ->走索引。

  select * from emp where job='sals' ->进行全表扫描、不走索引。

  如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。

Sql 优化:

当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划。
也就是说,数据库是执行的查询计划,而不是Sql语句。
查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器)。
其中基于规则的查询优化器在10g版本中消失。
对于规则查询,其最后查询的是全表扫描。而CBO则会根据统计信息进行最后的选择。

1、先执行From ->Where ->Group By->Order By

2、执行From 字句是从右往左进行执行。因此必须选择记录条数最少的表放在右边。这是为什么呢?  

3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。
因为这样进行连接时,可以去掉大多不重复的项。  

4. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

5、索引失效的情况:
 ① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null。 则会是索引失效。
 ② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC' 
或者SELECT Col FROM tbl WHERE name LIKE '%ABC%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 会使用索引。

 ③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
SELECT Col FROM tbl WHERE col > 10 * 10

 ④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10 
应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。

6、用UNION替换OR(适用于索引列)
  union:是将两个查询的结果集进行追加在一起,它不会引起列的变化。 由于是追加操作,需要两个结果集的列数应该是相关的,
并且相应列的数据类型也应该相当的。union 返回两个结果集,同时将两个结果集重复的项进行消除。 如果不进行消除,用UNOIN ALL.

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

7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN
在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 
在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历). 
为了避免使用NOT IN, 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

例子:

高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)

低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)

oracle数据库创建索引以及简单优化sql语句相关推荐

  1. Oracle数据库表连接查询并分页SQL语句提示未明确定义列

    Oracle数据库表连接查询并分页SQL语句提示未明确定义列 两张表中的字段: t_product t_category product_id category_id product_name cat ...

  2. Oracle数据库:实现批量插入的sql语句

    目录 问题现象: 问题分析: 注意:这里一定要注意分号(;)的使用: 否则容易出现报错,如: 解决方法: 问题现象: 今天想使用Oracle数据库进行批量插入的操作,发现和想象中的不太一样,报错如下: ...

  3. windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句

    windows 下 cmd 命令行登录 oracle 数据库方法.直接就登录进来了. C:\Users\Administrator>sqlplusSQL*Plus: Release 11.2.0 ...

  4. oracle 查看连接数语句,Oracle数据库中查询连接数的实用sql语句

    查询数据库中的连接信息.其中SQL_COMMAND 是可以释放进程的sql语句: select   A.SID,B.SPID,A.SERIAL#,a.lockwait,A.USERNAME,A.OSU ...

  5. Oracle数据库创建索引

    单一索引:Create Index On <Table_Name>(Column_Name); 复合索引:Create Index On emp(deptno,job); ->在em ...

  6. Oracle数据库Timestamp数据差值计算Sql语句

    今天的工作中遇到一个问题,需要计算数据库中两个时间字段的差值,字段类型是timestamp,将字段直接相减,会得到timestamp类型的结果值,不是我想要的number类型的值.在网上找了一些方法, ...

  7. 定时创建oracle索引,oracle数据库关于索引建立及使用的详细介绍

    索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护. 如果SQL语句仅访 ...

  8. ORACLE EXPLAIN PLAN的总结 (优化SQL语句)

    ORACLE EXPLAIN PLAN的总结 文章分类:数据库 在ORACLE数据库中,需要对SQL语句进行优化的话需要知道其执行计划,从而针对性的进行调整.ORACLE的执行计划的获得有几种方法,下 ...

  9. MySQL数据库创建索引的方法和好处

    MySQL 索引 数据库创建索引的几种方法 数据库建表添加索引(一) mysql创建索引三种方式 数据库索引的创建和使用 Mysql哪些字段适合建立索引 MySQL索引的创建与使用 MySQL索引是如 ...

最新文章

  1. 发现了lucene一个bug
  2. 线程返回值的方式介绍
  3. slplunk原始数据和索引数据大小比较
  4. 重温java中的String,StringBuffer,StringBuilder类
  5. TLD(Tracking-Learning-Detection)学习与源码理解之(六)
  6. 谁能想到,我给技术总监“上了一课”?
  7. 油管螺纹尺寸对照表_yt15硬质合金刀片尺寸|A320焊接刀头参数
  8. nRF51822 配对之device_manager_init 调用,以及保证 用户数据存储 的Flash 操作不与device manager 模块冲突...
  9. python学习笔记之property
  10. Linux 命令(98)—— basename 命令
  11. word转换html 批量,Word批量转HTML工具
  12. 鸟哥Linux第二十四章-Linux内核编译与管理简记
  13. 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
  14. Linux-各种UID
  15. oracle中的递归查询
  16. 诺基亚手机运行linux,LINUX:基本功能(2)_诺基亚手机_手机其它OS-中关村在线...
  17. BLE_BQB Test_Stable Modulation Characteristics at 2 Ms/s_RF-PHY/TRM/BV-11-C
  18. python空气质量指数计算_空气质量指数数据分析可视化
  19. RGB与Ycbcr空间的互相转换
  20. code engine

热门文章

  1. 在线绘制富集分析多组气泡图和单细胞分析marker基因矩阵气泡图
  2. 巴厘岛不如传说中美丽
  3. 网易七鱼携手全球时刻,用AI打造社交新零售服务闭环
  4. Java核心类库(下)
  5. Android仿小红书启动页平行动画
  6. python职位占比_2017年招聘数据:AI人才缺口仍超百万,Python需求增速达174%
  7. Java设计模式:抽象工厂模式--农场的季节生产对应水果举例
  8. 180.CSS火焰动画
  9. Hystrix 从入门到深入——一阅读官网
  10. 计算机考研420分能上清华吗,清华五道口金融学院复试,大量420分的学霸落榜,很扎心...