oracle性能调优

来源:互联网 发布:nginx伪静态规则写法 编辑:程序博客网 时间:2024/05/22 15:19
  1. oracle性能调优一般的方法
    1)Oracle性能调优一般是通过statspack,产生分析跟踪文件来定位效率低下的sql语句。然后通过各种手段,比如可以加入合适的索引,添加合适的hint来调整查询语句;用alter indexmonitoring usage;跟踪没有使用的索引并把这些索引删除、调整效率低下的索引(尤其使对大表上的索引)、加/+append/提示、批量插入等手段调整DML语句。
    2)注意SQL基本书写规范:少用IN、NOTIN、LIKE、<>、!=等耗时的写法;SELECT中不要用‘*’;where替换having;表用别名,抽取字段前加上表名等等。。。
    3)了解数据库内部机制,如Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后;Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾;Order By语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By语句中使用表达式。。。
    4)索引的使用:Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用。索引应该用在可以唯一确定数据的列上,如主键,如果一个索引可以确定一般数据那就没作用,如男女区别。索引也不是加的越多越好。不同类型的列进行比较索引会失效,where子句对索引列计算也会同样导致全表扫描数据从而索引失效。
  2. 索引的使用
    1)索引的创建
    在创建表时指定主键primary key ,外键或者uniqe ,oracle会自动创建索引。手动创建索引(为特定键创建索引)
    CREATE INDEX indexnameon tablename(column)
    2)创建索引的好处与坏处
    好处:
    索引能增加查询速度,通过快速定位的方法减少磁盘IO;
    利用索引的唯一性来控制记录的唯一性 ;可以加速表与表之间的连接;降低查询中分组和排序的时间。
    坏处:
    存储索引的磁盘空间; 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护(降低crud操作的性能);在数据处理时回需额外的回退空间。
    3) 什么情况下需要创建索引
    1、数据的数值分布较广;2、数值中含有大量null;3、列经常出现在where子句中或关联查询中;
    4)不适合创建索引的情况:
    1、表很小; 2、表经常有增删改查操作,查询的数据大于4% ;3、列不经常出现在查询中 ;4、加索引的列包含在条件表达式中
    5)索引的分类
    索引按存储方法分类
      B*树索引
       B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。
    位图索引
      位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。
      索引按功能分类
      唯一索引
      唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。
      主关键字索引
      主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
      一般索引
      一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。
      索引按索引对象分类
      单列索引(表单个字段的索引)
      多列索引(表多个字段的索引)
      函数索引(对字段进行函数运算的索引)
    5)注意事项
    索引不存储空值,如果对可空值的列 建立索引,是不起作用的。(个人理解,待求证)
0 0
原创粉丝点击