oracle数据库优化辅助SQL语句

时间:2021-05-02

这篇文章主要介绍了oracle数据库优化辅助SQL语句,需要的朋友可以参考下

具体详情请看下文代码分析。

  • --查询正在执行的SQL语句
  • SELECTOSUSER电脑登录身份,
  • PROGRAM发起请求的程序,
  • USERNAME登录系统的用户名,
  • SCHEMANAME,
  • B.Cpu_Time花费cpu的时间,
  • STATUS,
  • B.SQL_TEXT执行的sql,
  • B.
  • FROMV$SESSIONA
  • LEFTJOINV$SQLBONA.SQL_ADDRESS=B.ADDRESS
  • ANDA.SQL_HASH_VALUE=B.HASH_VALUE
  • ORDERBYb.cpu_timeDESC;
  • --查询比较耗CPU的SQL语句
  • select*
  • from(selectv.sql_id,
  • v.child_number,
  • v.sql_text,
  • v.elapsed_time,
  • v.cpu_time,
  • v.disk_reads,
  • rank()over(orderbyv.cpu_timedesc)elapsed_rank
  • fromv$sqlv)a
  • whereelapsed_rank<=10;
  • --查询比较耗磁盘的SQL语句
  • select*from(selectv.sql_id,
  • v.child_number,v.sql_text,
  • v.elapsed_time,v.cpu_time,
  • v.disk_reads,
  • rank()over(orderbyv.disk_readsdesc)elapsed_rank
  • fromv$sqlv)awhereelapsed_rank<=10;
  • --查询比较慢的SQL语句
  • select*from(
  • selectparsing_user_id,executions,sorts
  • command_type,disk_reads,sql_textfromv$sqlareaorderbydisk_readsdesc
  • )whererownum<10
  • --Oracle对未提交事务的查询
  • selecta.sid,a.blocking_session,a.last_call_et,a.event,
  • object_name,
  • dbms_rowid.rowid_create(1,data_object_id,rfile#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)"rowid",
  • c.sql_text,c.sql_fulltext
  • fromv$sessiona,v$sqlareac,dba_objects,v$datafile
  • wherea.blocking_sessionisnotnull
  • anda.sql_hash_value=c.hash_value
  • andROW_WAIT_OBJ#=object_idandfile#=ROW_WAIT_FILE#;
  • ps:oracle常见sql语句优化

    1、* 号引起的执行效率

    尽量减少使用select * 来进行查询,当你查询使用*,

    数据库会进行解析并将*转换为全部列。

    select count(si.student_id)

    from Student_info si(student_id为索引)

    select count(*) from Student_info si

    执行时.上面的语句明显会比下面没有用索引统计的语句要快

    2、避免在索引列上使用计算.

    WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.

    举例 :

    低效:

    SELECT … FROM DEPT WHERE SAL * 12 > 25000;

    高效 :

    SELECT … FROM DEPT WHERE SAL > 25000/12;

    3、用 >= 替代 >

    高效 :

    SELECT * FROM EMP WHERE DEPTNO >=4

    低效 :

    SELECT * FROM EMP WHERE DEPTNO >3

    两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4 的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 .

    4 、 用 UNION 替换 OR ( 适用于索引列 )

    通常情况下 , 用 UNION 替换 WHERE 子句中的 OR 将会起到较好的效果 . 对索引列使用 OR 将造成全表扫描 . 注意 , 以上规则只针对多个索引列有效 . 如果有 column 没有被索引 , 查询效率可能会因为你没有选择 OR 而降低 . 在下面的例子中 , LOC_ID 和 REGION 上都建有索引 .

    高效 :

  • SELECTLOC_ID,LOC_DESC,REGION
  • FROMLOCATION
  • WHERELOC_ID=10
  • UNION
  • SELECTLOC_ID,LOC_DESC,REGION
  • FROMLOCATION
  • WHEREREGION=“MELBOURNE”
  • 低效 :

  • SELECTLOC_ID,LOC_DESC,REGION
  • FROMLOCATION
  • WHERELOC_ID=10ORREGION=“MELBOURNE”
  • 如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面 .

    5、用 IN 来替换 OR

    这是一条简单易记的规则,但是实际的执行效果还须检验,在 ORACLE8i 下,两者的执行路径似乎是相同的.

    低效 :

    SELECT …. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30

    高效

    SELECT … FROM LOCATION WHERE LOC_IN IN (10,20,30);

    6、避免在索引列上使用 IS NULL 和 IS NOT NULL

    7、where执行顺序

    where执行会从至下往上执行

    select *

    from student_info si --学生信息表

    where si.school_id=10 --学院ID

    and si.system_id=100--系ID

    摆放where子句时,把能过滤大量数据的条件放在最下边

    8、from字段中的优化:

    Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表)。

    比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据。

    9、索引失效

    1、运算导致的索引失效

    2、类型转换导致的索引失效

    3、在索引列上进行计算引起的问题

    4、 Is not null引起的问题(student_id为索引)

    5、Order by导致索引失效(student_id为索引)

    6、自动选择索引

    7、 !=导致索引失效

    8、%导致的索引失效

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章