Oracle索引使用、SQL优化

1.索引的创建
1.1索引使用基本原则
1.1.1查询数据量仅占整个表数据量的2%-4%,甚至更低
1.1.2以查询字段为基础,表中的行随机均匀分布或者行随机排序
1.1.3表中的列相对较少,对表的大多数查询都包含相对简单的WHERE子句。
1.1.4缓存命中率低,并且不需要操作系统缓存。
1.2如何选择索引列和索引类型
1.2.1WHERE子句中频繁使用的列创建索引,在SQL语句中频繁用于连接的列上创建索引。
1.2.2不要再频繁修改的列上创建索引。
1.2.3存在大量并发的INSERT,UPDATE,DELETE语句访问父表或子表,可以在外建列创建索引。
1.2.4复合索引应该选择在WHERE子句中频繁使用的列,并且这些列用AND操作符连接。
1.2.5避免对表进行全表扫描,如下情况会发生全表扫描
1.2.5.1所查询的表没有索引。
1.2.5.2需要返回表中的所有数据。
1.2.5.3带有like并使用%的模糊查询
1.2.5.4带有not、in、not in、or、is null、is not null、<、>等运算符的查询
2.SQL优化
2.1使用绑定变量,在第二次查询时,系统可以直接从库缓存区中获得该语句以前执行时的分析、执行方案、提高执行效率。
select employee_id,salary from employees where department_id=&deptno;
2.2尽量避免对查询结果进行排序。DISTINCT、UNION、MINUS、INTERSECT、ORDER BY、GROUP BY的SQL语句都会进行一次或多次排序。
2.3尽量指定具体的列名,避免使用*
2.4尽量使用EXISTS替换IN、NOT EXISTS替换NOT IN
2.5尽量使用表的别名
3.连接查询,连接查询中,系统第一个查询的表称为驱动表。ORACLE通常对驱动表进行全表扫描。应该将数据返回百分比高的表作为驱动表或者数据量小的表作为驱动表。如果链接的表在连接列上都具有索引,则优化器将FROM语句中最后的表作为驱动表。Oracle采用从右到左的顺序解析FROM子句中的表名,应该将驱动表放在FROM子句的最后,最先被处理。如果在FROM子句中包含3个以上的表,应该选择交叉表作为驱动表。交叉表是指那个被其它表所引用的表

3.索引被无视
3.1同一张表列与列的对比
3.2where field is not null 因为该列的值存在null,该列的索引是不会为null创建条目
3.3 not in、not exists、<>的情况是很难使用到索引
3.4 like前置通配符
3.5在索引列上使用了函数,这样同样是无法使用索引的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值