关于SQL优化的一些知识

发表于:2007-07-02来源:作者:点击数: 标签:
关于 SQL 优化我提提几点总结,这里没有具体的实例,如果大家有兴趣,可以把他贴上来 1.除非写频率很低,否则不要用RAID5,但是对于cache能够减少RAID5的负荷 2.对于一个chained fetch ratio的,建议需要用一个高的pctfree来rebuild table 3.如果你有一个很

    关于SQL优化我提提几点总结,这里没有具体的实例,如果大家有兴趣,可以把他贴上来
  
  1.除非写频率很低,否则不要用RAID5,但是对于cache能够减少RAID5的负荷
  
  2.对于一个chained fetch ratio的,建议需要用一个高的pctfree来rebuild table
  
  3.如果你有一个很高的磁盘排序率,那么建议修改sort_area_size,将其增大
  
  4.buffer busy waits常常是由于很频繁的insert ,需要重建,或者没有充足的回滚段引起的
  
  还应观注一下event这列其他值,这是我们调优的关键一列,下面对常出现的event做以简要的说明:
  
  free buffer waits这个参数所标识是dbwr是否够用的问题,与IO很大相关的,
  
  当v$session_wait中的free buffer wait的条目很小或没有的时侯,说明你的系统的dbwr进程决对够用,
  
  不用调整;free buffer wait的条目很多,你的系统感觉起来一定很慢,这时说明你的dbwr已经不够用了,
  
  它产生的wio已经成为你的数据库性能的瓶颈,这时的解决办法如下:
  
  a.1增加写进程,同时要调整 db_block_lru_latches 参数
  
  示例:修改或添加如下两个参数
  
  db_writer_processes=4
  
  db_block_lru_latches=8
  
  a.2开异步IO,IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。
  
  5.递归SQL
  
  为了决定所有表和列在SQL中的名字是否正确,ORACLE必须通过数据字典检查有效性,这些信息通常在内存中(ROW CACHE)
  
  找到了,但是如果在内存中找不到,那么就需要要进行递归SQL
  
  6.在不改变源代码的前提下,可以通过两个参数调整来减少解析
  
  cursor_sharing
  session_cached_cursors
  
  7.open cursor通常意义上仅是得到一个handle,但在某些情况下不是。
  
  open cursor只是简单的定位首记录的指针
  
  8.创建新表后,高水位为第5块
  
  9.hash join
  
  如果整个hash表能够填充到内存,将很好,否则就需要临时表来进行分配。
  
  所以hash join常常对于两个不同大小的表进行连接,也可以在并行模式和反向连接中工作的很好
  
  10.存储概要能够帮助从一个低版本移植到高版本,也可以将RULE移植到COST
  
  11.OR常常可以利用union来实现索引的使用,当然ORACLE优化器有时也会自动进行转换
  
  12.经常被> <等操作的列都要在可能的情况下使用索引
  
  13.叶块包含了上一块和下一块的指针,所以允许对于索引过的列,使用order by和使用> <等操作进行利用
  
  另外,对于索引扫描,即使没有任何记录,也会有3-4个IO,因为有纵向SCAN
  
  对于大表,深度为4(1个都块,2级分支块和叶块),但是常常头块和分支块通常都会在内存,所以只会有1到2个物理读块
  
  14.索引键值分离是很昂贵的,对于使用插入增量序列的值,可以避免索引分离
  
  15.不能压缩分区索引和位图索引
  
  16.唯一索引或者主键常常是很好的hash key,因为hash key不适合区域扫描
  
  17.由于普通的B树索引,仍然消耗了很大磁盘空间,并且insert update delete也同样有很大的负载,所以考虑采用IOT,这样就没有表了,索引本身就是表,但是结构可是索引结构。主键将和所有列存储在叶节点,这样就造成了可能对索引结构的性能下降,所以可以通过设置including 来将某些不常用的大字段列放到益出段,对于想BOLB字段,可以采用disable storage in row使得分离不常查询的BOLB字段分离到别的段和表空间
  
  18.query+current为逻辑读
  
  autotrace没有每一步的row count,也不包括cpu or elapsed times
  
  19.对于绑定变量与直方图的选择
  
  条件       绑定       直方图
  ----------------------------  -------------------   -----------------------
  搜索值不变    不需要      可能需要
  range scan         不需要       需要
  执行精确查找,
  但有些值分布很少  不需要      需要
  这个SQL执行很频繁,
  期望快速执行    需要         不需要
  用户特定使用的
  复杂的SQL        可能不需要,因为最终 需要
  用户可能不喜欢
  
  20.对于有null值的列要建立索引,那么最好使用default(where改成默认值),并设置not null

[1]     

原文转自:http://www.ltesting.net