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. 临时表    慎重使用临时表,可以极大的提高性能。   

原文地址:https://www.cnblogs.com/wisdo/p/7439816.html