Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SQL practical optimization

Avatar for halfrost halfrost
December 25, 2018

SQL practical optimization

Avatar for halfrost

halfrost

December 25, 2018
Tweet

More Decks by halfrost

Other Decks in Programming

Transcript

  1. create table test1(id,object_name,owner) as select object_id as id,object_name,owner from dba_objects;

    create table test2(id,object_type,status) as select object_id as id,status,temporary from dba_objects; select count(*) from test1 t1,test2 t2 where t1.id=t2.id and t1.owner='SCOTT'; create index idx_test1 on test1(id,owner); create index idx_test2 on test2(id); exec dbms_stats.gather_table_stats(user,'test1',cascade=>true,estimate_percent=>100); exec dbms_stats.gather_table_stats(user,'test2',cascade=>true,estimate_percent=>100);
  2. create table test as select * from dba_objects; --创建虚拟索引,首先要将 _use_nosegment_indexes的隐含参数设置为true

    alter session set "_use_nosegment_indexes"=true; create index ix_test on test(object_id) nosegment; explain plan for select * from test where object_id=1; set linesize 1000 select * from table(dbms_xplan.display()); set autotrace traceonly select * from test where object_id=1;
  3. --以下看的是真实执行计划,显 然是用不到索引。 alter session set statistics_level=all; select * from test

    where object_id=1; select * from table(dbms_xplan.display_cur sor(null,null,'allstats last'));
  4. create table test1 ( a int, b varchar2(80) ); begin

    for i in 1 .. 100000 loop insert into test1(a,b) values (i, rpad(dbms_random.random,75,'*') ); end loop; end; alter table test1 add constraint test1_pk primary key(a); begin dbms_stats.gather_table_stats( user, 'TEST1', cascade=>true ); end; select /*+ index( test1 test1_pk ) */ * from test where a between 20000 and 40000; create table test2 as select a,b from test1 order by b; alter table test2 add constraint test2_pk primary key (a); begin dbms_stats.gather_table_stats( user, 'TEST2', cascade=>true ); end; select /*+ index( test2 test2_pk ) */ * from test where a between 20000 and 40000;
  5. SQL> create or replace view v_emp as select /*+ no_merge

    */ empno,ename,job from emp where sal>3000; SQL> select * from v_emp where ename='KING';
  6. SQL> create or replace view v_emp as select /*+ no_merge

    */ empno,ename,job from emp where sal>3000 and rownum>=1; SQL> select * from v_emp where ename='KING';
  7. with c as (select e.*,min(salary) over(partition by department_id) as min_salary

    from employees e) select employee_id,first_name,last_n ame,salary from c where c.salary=c.min_salary;
  8. create table test1 as select * from dba_objects; create table

    test2 as select * from dba_objects; select /*+ gather_plan_statistics */ a.owner,count(*) from test1 a,test2 b where a.object_name=b.object_name group by a.owner; select * from table(dbms_xplan.display_cursor(null ,null,'ALLSTATS LAST'));
  9. select /*+ gather_plan_statistics dynamic_sampling(a 10) dynamic_sampling(b 10) */ a.owner,count(*) from

    test1 a,test2 b where a.object_name=b.object_name group by a.owner; select * from table(dbms_xplan.display_curs or(null,null,'ALLSTATS LAST'));
  10. select * from (select row_.*, rownum rownum_ from (select t.bookreviewid,

    t.msisdn, t.contentid, t.contenttype, t.portaltype, t.publishstatus, t.commentary, t.publishsdate, t.createtime, t.floorNum, t.istop, t.assessstatus, t.isprime, :"SYS_B_0" as createNick, nvl(opposenum, :"SYS_B_1") as opposenum, nvl(abetnum, :"SYS_B_2") as abetnum, t.replycontent, t.latestreplytime from us_publiccomment t where :"SYS_B_3" = :"SYS_B_4" and t.publishstatus in (:"SYS_B_5", :"SYS_B_6") and t.contenttype = :1 and t.contentid = :2 order by t.isTop desc, t.floornum desc) row_ where rownum <= :"SYS_B_7") where rownum_ >= :"SYS_B_8"
  11. 早上老综合库在9点24分的时候出现了ORA-600错误,错误内容如下: Tue May 12 09:24:52 2015 Errors in file /oracle/database/diag/rdbms/integ/integ3/trace/integ3_ora_910.trc

    (incident=755353): ORA-00600: 内部错误代码, 参数: [kokegPinLob1], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /oracle/database/diag/rdbms/integ/integ3/incident/incdir_755353/integ3_ora_910_i755353.trc Tue May 12 09:25:27 2015 Errors in file /oracle/database/diag/rdbms/integ/integ3/trace/integ3_ora_2327.trc (incident=754858): ORA-00600: 内部错误代码, 参数: [kokegPinLob1], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /oracle/database/diag/rdbms/integ/integ3/incident/incdir_754858/integ3_ora_2327_i754858.trc 通过跟踪后台日志发现是下列SQL引起的: ========= Dump for incident 755353 (ORA 600 [kokegPinLob1]) ========
  12. *** 2015-05-12 09:24:52.923 dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3,

    mask=0x0) ----- Current SQL Statement for this session (sql_id=5nz1w5b0f1dxy) ----- select * from (select r.*, ROWNUM rn from (select A.*,T.RESOURCE_NAME,C.RES_GRP_NAME, T.CATEGORY,ip.ip,B.TYPE,B.start_time,ROWNUM from SLAVE_ACCOUNT A, PRACCT_SLACCT_R B , APP_RESOURCE T, RESOURCE_GROUP C ,(select t.resource_id,wm_concat(t.ip) ip from resource_ip t group by t.resource_id) ip WHERE A.SLACCT_ID = B.SLACCT_ID and t.resource_id=ip.resource_id AND A.RESOURCE_ID = T.RESOURCE_ID AND T.RES_GRP_ID = C.RES_GRP_ID AND B.PRACCT_ID = :1 AND (B.CANCEL_TIME is null or B.CANCEL_TIME>SYSDATE ) and A.STATE != 2 ORDER BY A.SLACCT_ID ASC ) r where ROWNUM < :2) where rn >= :3
  13. 该函数在Oracle官方的文档中是:function is used internally and for this reason it is

    UN-documented,11g listagg使用比wmsys.wm_concat效率高很 多,wmsys.wm_concat是undocument函数,有很多不确定因素,不建议使用,而且 12c已经删除了wmsys.wm_concat,建议11g库对wmsys.wm_concat最好修改为 listagg。