Oracle 学习笔记
Posted wisdo的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 学习笔记相关的知识,希望对你有一定的参考价值。
一、高效 SQL 语句原则
- 在where 中用 = 关系运算时
- 避免用函数在关系运算中,除非你使用函数建立索引
- 尽量不要隐式转化数据类型,数据类型一定要匹配
- 尽量将一句SQL分成多个语句完成
- 不能差分的请用UNION ALL 来组合
- 条件确定的子查询 Exist 适合于外表小,内表大 in 适合于外表大,内表小
- 使用视图的注意事项
- 复杂视图的连接要小心,尤其有外键的时候
- 当查询的是视图中引用的部分表的时候,请不要使用视图,或者建立新的更小的表
- 存储中间结果
- 对查询中可能多次调用的结果集,请保存
- 考虑使用物化视图
- 将复杂的不能优化的查询分阶段完成
- 尽量减少访问数据的次数
- 使用 case 语句
- 使用高级分组rollup,cube
- 使用存储过程
- 使用 RETURNING 子句
二、全表扫描
- 全表扫描:将高水位线下的数据块都读一遍。
- DB_FILE_MULTIBLOCK_READ_COUNT 参数决定扫描的速度,该参数的值乘以块的
- 大小应该小于操作系统的最大io
- 因为范围是连续的块,所以全表扫描会连续的读,效率很高
三、何时会使用全表扫描
1.表小
2.索引缺少,条件判定列上没有索引
3.使用hint,强制使用全表扫描
4.读的数据比重大。一般超过 10%的数据要读取就会选择全表扫描
5.并行查询,和索引是对立的,两者必须选择一个
四、全表扫描的优化
1.回收高水位线
2.DB_FILE_MULTIBLOCK_READ_COUNT 加大
3.使每个块装的数据更多,减少 pctfree
4.使用并行查询
alter system set db_file_multiblock_read_count=32;修改参数配置,默认为16 个块
alter table t1 pctfree 0; 将每个数据块都装满
alter table t1 move tablespace users; 移动表空间
五、 数据库查询的优化,Hints
Hints,即提示,强制该语句以我们指定的方式运行,作用范围是当前语句,对后面语句不影响。书写时,一定要放在第一个单词(select) 的后面。Hints 的写法有两种: /*+ 提示 */ , --+ 提示
六、SQL 查询优化
1.尽量避免在一个复杂查询里面使用 LIKE ‘%parm1%‘ 百分号会导致相关列的索引无法使用,最好不要用.
-
- 在前端进行下拉框的输入搜索
- 在后端进行查询范围控制,不查询无关数据
2. 索引
-
- 数据量大的时候,建立索引
- 避免对索引进行计算操作
- 避免在索引列上使用 not, <>, !=
- .避免在索引列上使用 is null 和 is not null
- 避免在索引列上使用数据类型转换
- .避免在索引列上使用函数
- 避免在索引列上使用空值
3. 复杂查询 可将复杂查询进行拆分,分步进行
4. 尽量使用 union all union 会对数据进行排序,并去除重复的行,比较消耗资源 union all 则不进行排序,不去除重复的行
5. 在where 语句中合理使用 in , not in ,exist,not exist Exist 适合于外表小,内表大 in 适合于外表大,内表小
6. 排序 避免使用消耗资源的操作,带有 distinct, uinon,minus,intersect,order by 的语句 会启动 sql 引擎,distinct 需要一次排序,而其它至少需要执行2次排序。
7. 临时表 慎重使用临时表,可以极大的提高性能。
以上是关于Oracle 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章