当前位置: 首页 > news >正文

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')

本文转自:http://www.cnblogs.com/tianmingt/articles/4444885.html

转载于:https://www.cnblogs.com/dreammyle/p/5199821.html

相关文章:

  • 字符流查看txt文件
  • Java设计和实现方法
  • GitHub-版本控制
  • 安装nginx+lua开发环境
  • POJ2115 C Looooops 模线性方程(扩展欧几里得)
  • 矩阵快速幂,简单粗暴
  • Mysql----浅入浅出之视图、存储过程、触发器
  • 当前端也拥有 Server 的能力
  • GridView中使用 jQuery DatePicker (UpdatePanel)
  • 39.Android版本小知识
  • 适合初学者的理解Sphinx运行方式
  • java--- Map详解
  • springMVC-mvc:annotation-driven
  • MyCat源码分析系列之——BufferPool与缓存机制
  • web项目中各种路径的获取
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • co.js - 让异步代码同步化
  • Create React App 使用
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JavaScript DOM 10 - 滚动
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js面向对象
  • js作用域和this的理解
  • Lsb图片隐写
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 高度不固定时垂直居中
  • 力扣(LeetCode)357
  • 少走弯路,给Java 1~5 年程序员的建议
  • 收藏好这篇,别再只说“数据劫持”了
  • Prometheus VS InfluxDB
  • #if #elif #endif
  • #预处理和函数的对比以及条件编译
  • (C)一些题4
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (七)理解angular中的module和injector,即依赖注入
  • (十八)三元表达式和列表解析
  • (十六)串口UART
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Dubbo快速入门、介绍、使用
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)ObjectiveC 深浅拷贝学习
  • (转)视频码率,帧率和分辨率的联系与区别
  • (状压dp)uva 10817 Headmaster's Headache
  • ***详解账号泄露:全球约1亿用户已泄露
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Framework杂记
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @RequestMapping-占位符映射
  • [20171106]配置客户端连接注意.txt
  • [Android Pro] Notification的使用