ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【笔记】statspack 学习(二) sql调整

【笔记】statspack 学习(二) sql调整

原创 Linux操作系统 作者:yellowlee 时间:2009-04-18 21:31:51 0 删除 编辑

sql调整很重要的方面在于:
1,索引
2,join

优化器模式:rule,first row,all rows,choose
除rule以外,注意其他三个需要先对表和索引analyze
rule注意索引的选择,其他则要注意全表扫描问题。

关于索引的选择:
1,分析读取数据量与总数据量的比例(有序40%,无序7%),注意使用全表扫描和索引的选择
2,注意时间字段上的索引
3,注意字典表中的索引,注意大表内类型字段上的索引,特别是在大量数据行读取的时候。
4,索引类型的选择注意


基于规则的优化器注意:
1,数据表顺序,注意驱动表的选择,即from后最后一个表(一般认为是返回数据行最少的表)
2,where条件的顺序(最后一个是可以去除最多数据行的条件,以此类推)
3,注意检查是否使用不合理的索引

基于成本的优化器注意:
1,analyze table and index
可以按owner来analyze,调整时注意利用analyze结果:
select * from dba_tables where wner = 'TEST' (主要:num_rows, blocks, empty_blocks AS empty, avg_space,

chain_cnt, avg_row_lend等)
下面生成的sql,也可以加入定时作业

SQL> set pages 999
SQL> set heading off
SQL> set echo off
SQL> set feedback off
SQL> spool ?\exp\tuning\analyze_all.sql
SQL> select 'analyze table '||owner||'.'||table_name||' compute statistics;' from dba_tables where o
wner = 'TEST';
SQL> select 'analyze index '||owner||'.'||index_name ||'compute statistics;' from dba_indexes where
owner = 'TEST';
SQL> spool off;
SQL> set echo on
SQL> set feedback on
SQL> @ ?\exp\tuning\analyze_all.sql


2,使用hint
/* + rule*/
/* + full, table =xx parallel=nn */
/* + table=xx index = xx */
/* + first_rows */
/* use_hash */


sql写法调整:
开始前识别低效的sql:
1,使用系统表:
SELECT EXECUTIONS,
       DISK_READS,
       BUFFER_GETS,
       ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2) Hit_radio,
       ROUND(DISK_READS / EXECUTIONS, 2) Reads_per_run,
       SQL_TEXT
  FROM V$SQLAREA
 WHERE sql_text like '%&sql_text%'
   AND EXECUTIONS > 0
   AND BUFFER_GETS > 0
   AND (BUFFER_GETS - DISK_READS) / BUFFER_GETS < 0.8
 ORDER BY 4 DESC;
2,使用statspack:

select * from perfstat.stats$snapshot;

drop table sqltuning_temp_table1;
create table sqltuning_temp_table1 as
select min(snap_id) min_snap
  from perfstat.stats$snapshot
 where snap_time > sysdate - &days_back;


drop table sqltuning_temp_table2;
create table sqltuning_temp_table2 as
select  executions,
       to_date(snap_time, 'dd mon hh24:mi:ss') as mydate,
       loads,
       parse_calls,
       disk_reads,
       buffer_gets,
       rows_processed,
       sorts,
       sql_text
  from perfstat.stats$sql_summary sql, perfstat.stats$snapshot sn
 where sql.snap_id > (select min_snap from sqltuning_temp_table1)
   and sql.snap_id = sn.snap_id
 order by &sortkey desc;

select * from sqltuning_temp_table2 where rownum < #

上面需要设置天数,sortkey,和rownum,根据需要设定。

具体:
1,避免使用子查询,而使用Join
2,in 和 exists 写法的选择,not in 和 not exists的选择
3,注意函数代替:order by,group by,distinct都是比较耗时的
   union,minus,intersect一般可以代替
4,注意连接的字段类型,隐式的类型转换可能不使用索引
  注意!= || not 等和其他函数 将不使用索引,可以考虑function-based index
5,重用,参数化,使用 :val 。缓冲区清理:alter system flush shared pool
   确定缓冲区中非重用sql:
 select a.sql_text
   from v$sql a,
        (select substr(sql_text, 1, &size) sqltext, count(*)
           from v$sql
          group by substr(sql_text, 1, &size)
         having count(*) > 10) b
  where substr(a.SQL_TEXT, 1, &size) = b.sqltext;
6,注意使用create as 来建立临时表来代替一些大的子查询,适当使用 with xx as () select
7,增加索引(待续)


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-590912/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-12-27

  • 博文量
    316
  • 访问量
    658644