zoukankan      html  css  js  c++  java
  • Oracle数据库SQL优化

    SQL优化的最终目的是用户体验-在最短时间内让用户在页面数据。因此,执行时间是SQL优化的重要指标。在SQL查询中,I/O操作最占系统性能的。I/O操作量越大,时间越久。减少I/O操作量是优化SQL的目标。同时,CPU,缓存命中率也很重要。

    并不是所有SQL都需要被优化,使用频率高,性能差的SQL语句需要重点被优化。可以通过查看v$sqlarea表,访问OEM来查找。

    注意不同版本的Oracle使用不同的优化器。11g的优化器基于代价(Cost Based Optimizer)(考虑SQL执行耗费的资源代价)11g之前是基于规则来优化的(Rule Based Optimizer)。优化要针对优化器来完成。

    1.合理使用索引

    原理:ORACLE是按行存储数据的(ROWID是行的位置) 而查询条件是列的,数据结构不同,查找速度慢。 建立按列存储的索引可以按列查找,数据在一个区域内,速度快。(弊端:事务处理起来不方便,增加了Insert, Update的执行时间)

    原则:

    适合使用索引的列:

    1.经常被查询的列

    2.经常排序分组的列

    3.经常连接的列

    不适合使用索引的列

    1.数据经常更改的列

    2.数据量小、重复性高的列

    注意:

    1.给索引指定单独的表空间可以增加IO性能

     2.表完全导入完毕后再创立索引

    3.表中总索引数不易过大

    2.SQL语句的优化

    1.用列名代替*

     使用*,SQL会对每个列进行匹配,降低效率

    2.当表与其他表没有任何关联时,可以用TRUNCATE代替DELETE

      TRUNCATE没有事务控制,性能高,但是要注意无法被rollback

    针对11g之前的优化方法 (基于规则的优化器)

    1. 用EXISTS代替IN,DISTINCT

    2. 二连表查询时,选择数据少的表作为驱动表(放在FROM的表列表的最后面)。循环驱动表中的数据和另一个表中的数据作连接查询。多表联查时,选择关联最多的表。

    3. 表连接条件放前面,过滤记录多的条件的子句放后面(因为SQL执行顺序是从右到左)

    3.表分区

    将数据量大的表分区也可以提升查询效率,还可以方便表的管理,备份,和恢复,提高表的安全性。

    分区方法:

    范围分区

    散列分区(根据哈希值)

    列表分区 (明确指定列来分区)

    指定分区查询

    select * from table partition(pt_rule);

  • 相关阅读:
    Python
    TERSUS笔记116-删除数据操作
    TERSUS笔记115-修改数据操作
    TERSUS笔记114-表格分页操作
    TERSUS笔记113-查询数据操作
    TERSUS笔记111-上传图片在列表中显示
    TERSUS笔记110-增加保存验证数据操作
    TERSUS笔记103-本地开发测试mysql数据库连接
    TERSUS笔记102-CSS样式和icon图标设置说明
    TERSUS笔记101-常用元件和操作说明
  • 原文地址:https://www.cnblogs.com/yidan621/p/5224497.html
Copyright © 2011-2022 走看看