OracleのFAQ-パフォーマンスの調整

12787 ワード

[Q]        

[A] system  

  $ORACLE_HOME/rdbms/admin/utlxplan.sql     

  $ORACLE_HOME/sqlplus/admin/plustrce.sql  plustrace  

               , 

SQL>create public synonym plan_table for plan_table;

SQL> grant all on plan_table to public;

                    , 

SQL> grant plustrace to public;

        /    

SET AUTOTRACE ON |OFF

| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN

[Q]                 

[A]          

Alter session set sql_trace true|false

Or

Exec dbms_session.set_sql_trace(TRUE);

         ,       

exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)

      user_dump_dest                     (   Win  ,   unix       )

SELECT p1.value||'\'||p2.value||'_ora_'||p.spid||'.ora'  filename

FROM

v$process p,

v$session s,

v$parameter p1,

v$parameter p2

WHERE p1.name = 'user_dump_dest'

AND p2.name = 'db_name'

AND p.addr = s.paddr

AND s.audsid = USERENV ('SESSIONID')

  ,    Tkprof       , 

Tkprof          sys=n

[Q]             

[A]      alter system set sql_trace=true     

                 ,    

alter system set events

'10046 trace name context forever,level 1';

      ,       

alter system set events

'10046 trace name context off';

   level 1    8      

level 1:  SQL  ,  sql_trace=true

level 4:         

level 8:      

level 12:           

[Q]     OS      DB            

[A]    ,   OS   , TOP       OS  ,      OS    DB   ?

          :

$more whoit.sh

#!/bin/sh

sqlplus /nolog <<EOF

connect / as sysdba

col machine format a30

col program format a40

set line 200

select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss')

from v\$session where paddr in

( select addr from v\$process where spid in($1));

select sql_text from v\$sqltext_with_newlines

where hash_value in

(select SQL_HASH_VALUE from v\$session where

paddr in (select addr from v\$process where spid=$1)

)

order by piece;

exit;

EOF

  ,     OS         

$./whoit.sh Spid

[Q]         

[A]         analyze  

 Analyze table tablename compute statistics;

Analyze index|cluster indexname estimate statistics;

ANALYZE TABLE tablename COMPUTE STATISTICS

FOR TABLE

FOR ALL [LOCAL] INDEXES

FOR ALL [INDEXED] COLUMNS;

ANALYZE TABLE tablename DELETE STATISTICS

ANALYZE TABLE tablename VALIDATE REF UPDATE

ANALYZE TABLE tablename VALIDATE STRUCTURE

[CASCADE]|[INTO TableName]

ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName]

  。

             ,        ,      

Dbms_utility(8i      )

Dbms_stats(8i        )

 

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);

dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

              

1、     ,    DBMS_STATS,     Analyze  。

a)        ,     ,  Table

b)                      。

c)          Compute Statistics:    ,   ,  ,    

d)          

e)              

2、DBMS_STATS   

a)    Validate Structure

b)      CHAINED ROWS,     CLUSTER TABLE   ,         Analyze  。

c)  DBMS_STATS          Analyze,    Cascade False,       True

3、  oracle 9   External Table,Analyze    ,    DBMS_STATS     。

[Q]         

[A]  rebuild  ,                 

rebuild           ,                       

   

alter index index_name rebuild tablespace ts_name

storage(……);

               ,       ,  ,               

SQL> set heading off

SQL> set feedback off

SQL> spool d:\index.sql

SQL> SELECT 'alter index ' || index_name || ' rebuild '

||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'

FROM all_indexes

WHERE ( tablespace_name != 'INDEXES'

OR next_extent != ( 256 * 1024 )

)

AND owner = USER

SQL>spool off

            

alter index index_name coalesce,                leaf block

    ,                   ,     。

[Q]    Hint  

[A]  select/delete/update  /*+ hint */

  select /*+ index(TABLE_NAME INDEX_NAME) */ col1...

  /* +       

  hint        

select /*+ index(cbotab) */ col1 from cbotab;

select /*+ index(cbotab cbotab1) */ col1 from cbotab;

select /*+ index(a cbotab1) */ col1 from cbotab a;

  

TABLE_NAME      ,              , hint            ;

INDEX_NAME     ,Oracle           ;

           ,   hint     ;

[Q]               

[A]         Nologging  

 :Create table t1 nologging

as select * from t2;

          append  ,      

noarchivelog   ,    append  nologging   。

 archivelog ,       Nologging  。

 insert /*+ append */ into t1

select * from t2

  :   9i       FORCE LOGGING,         ,     ,  ,           NO FORCE LOGGING。

Alter database no force logging;

     FORCE LOGGING,         

SQL> select force_logging from v$database;

[Q]          

[A]     ,Oracle                  ,                       , :

 test,   a,b,c,d, a,b,c       inx_a(a,b,c), b          Inx_b(b)。

      ,where a=? and b=? and c=?     inx_a,

where b=?     inx_b

  ,where a=? and b=? and c=? group by b        ?        (        )             ,oracle       inx_b。         ,       ,         。

  ,               inx_b,   inx_a。

where a=? and b=? and c=? group by b||''  --  b   

where a=? and b=? and c=? group by b+0  --  b   

         ,              

  ,       no_index  ,         ,         :

select /*+ no_index(t,inx_b) */ * from test t

where a=? and b=? and c=? group by b

[Q]Oracle              

[A]  9i             (Index Skip Scan).

      index(a,b,c),      

where b=?   ,        index(a,b,c)

 ,           :

INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)

Oracle    (     CBO)      Index Skip Scans        :

1          。

2                       (      )。

3              (    /     )。

4    SQL  

 。

[Q]           

[A]    nosegment  , 

create index virtual_index_name on table_name(col_name) nosegment;

     session        ,           

alter session set "_use_nosegment_indexes" = true;

     explain plan for select ……         

  @$ORACLE_HOME/rdbms/admin/utlxpls      

  ,    ,          ,       

drop index virtual_index_name;

  :            ,               ,              ,           ,         。

[Q]         

[A]Oracle 9i  ,           ,              ,         

   :

    :alter index index_name monitoring usage;

      :select * from v$object_usage;

    :alter index index_name nomonitoring usage;

  ,             ,         :

set heading off

set echo off

set feedback off

set pages 10000

spool start_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'

FROM dba_indexes

WHERE owner = USER;

spool off

set heading on

set echo on

set feedback on

------------------------------------------------

set heading off

set echo off

set feedback off

set pages 10000

spool stop_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'

FROM dba_indexes

WHERE owner = USER;

spool off

set heading on

set echo on

set feedback on

[Q]            

[A]    OUTLINE   SQL       

           OUTLINE

Create oe replace outline OutLn_Name on

Select Col1,Col2 from Table

where ……

     Outline,    

Drop Outline OutLn_Name;

        OutLine,   OUTLN   OL$HINTS   

      ,     update outln.ol$hints   outline

 update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)

where ol_name in ('TEST1','TEST2');

  ,   Test1 OUTLINE Test2 OUTLINE   

          OUTLINE,        

Alter system/session set Query_rewrite_enabled = true

Alter system/session set use_stored_outlines = true

[Q]v$sysstat  class      

[A]    

1       

2   Redo buffer  

4    

8         

16   OS  

32       

64      

128       

[Q]            

[A] Alter system kill session 'sid,serial#';

  

alter system disconnect session 'sid,serial#' immediate;

 win ,     oracle   orakill      (      Oracle  )

 Linux/Unix ,      kill          OS  

[Q]           

[A]             ,           ,            ,     ,     。

               DML      ,     ,  DML          ,     ,     。

    alter system kill session ‘sid,serial#’     

SELECT /*+ rule */ s.username,

decode(l.type,'TM','TABLE LOCK',

'TX','ROW LOCK',

NULL) LOCK_LEVEL,

o.owner,o.object_name,o.object_type,

s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser

FROM v$session s,v$lock l,dba_objects o

WHERE l.sid = s.sid

AND l.id1 = o.object_id(+)

AND s.username is NOT NULL

        ,                    

              ,     。

SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,

o.owner,o.object_name,o.object_type,s.sid,s.serial#

FROM v$locked_object l,dba_objects o,v$session s

WHERE l.object_id=o.object_id

AND l.session_id=s.sid

ORDER BY o.object_id,xidusn DESC

             ,      ,        。             ,      V$rollname,  xidusn      USN

[Q]            (extent     )

[A]      (100k)extent  ,        drop table  ,      CPU(Oracle  fet$、uet$        ),          ,           extent,       :

1. truncate table big-table reuse storage;

2. alter table big-table deallocate unused keep 2000m (      n-1/n);

3. alter table big-table deallocate unused keep 1500m ;

....

4. drop table big-table;

[Q]             

[A]9i      

ALTER DATABASE DATAFILE 'file name' RESIZE 100M     

9i      

ALTER DATABASE TEMPFILE 'file name' RESIZE 100M

  ,          ,      ,              ,            。

[Q]       

[A]        

1、                  

SELECT username,sid,serial#,sql_address,machine,program,

tablespace,segtype, contents

FROM v$session se,v$sort_usage su

WHERE se.saddr=su.session_addr

2、               

SQL>Alter system kill session 'sid,serial#';

3、 TEMP       

SQL>Alter tablespace TEMP coalesce;

         

1、   TEMP    ts#

SQL> select ts#, name FROM v$tablespace;

TS# NAME

-----------------------

0 SYSYEM

1 RBS

2 USERS

3* TEMP

……

2、       

alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'

  :

temp    TS#   3*, So TS#+ 1= 4

              , 

TS# = 2147483647

[Q]   dump       ,             

[A]    

1、       ,      n  m

alter system dump datafile n block m

2、      

alter system dump logfile logfilename;

3、         

alter session set events 'immediate trace name CONTROLF level 10'

4、         

alter session set events 'immediate trace name FILE_HDRS level 10'

5、       

alter session set events 'immediate trace name REDOHDR level 10'

6、      ,   10    ,     

alter session set events 'immediate trace name SYSTEMSTATE level 10'

7、      

alter session set events 'immediate trace name PROCESSSTATE level 10'

8、  Library Cache     

alter session set events 'immediate trace name library_cache level 10'

[Q]           

[A]          10000 to 10999,                 

SET SERVEROUTPUT ON

DECLARE

err_msg VARCHAR2(120);

BEGIN

dbms_output.enable (1000000);

FOR err_num IN 10000..10999

LOOP

err_msg := SQLERRM (-err_num);

IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN

dbms_output.put_line (err_msg);

END IF;

END LOOP;

END;

/

 Unix   ,             

$ORACLE_HOME/rdbms/mesg/oraus.msg

             

event=10000

while [ $event -ne 10999 ]

do

event=`expr $event + 1`

oerr ora $event

done

       /       ,         

SET SERVEROUTPUT ON

DECLARE

l_level NUMBER;

BEGIN

FOR l_event IN 10000..10999

LOOP

dbms_system.read_ev (l_event,l_level);

IF l_level > 0 THEN

dbms_output.put_line ('Event '||TO_CHAR (l_event)||

' is set at level '||TO_CHAR (l_level));

END IF;

END LOOP;

END;

/

[Q]   STATSPACK,      ?

[A]Statspack Oracle 8i                    ,        BSTAT/ESTAT   ,     

        $ORACLE_HOME/rdbms/admin/spdoc.txt。

  Statspack:

cd $ORACLE_HOME/rdbms/admin

sqlplus "/ as sysdba" @spdrop.sql        --   ,        

sqlplus "/ as sysdba" @spcreate.sql        --             

  Statspack:

sqlplus perfstat/perfstat

exec statspack.snap;            --         ,             

--      ,           ,      

select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;

@spreport.sql                                --                   

      s:

spauto.sql -   dbms_job      ,     STATPACK       

sppurge.sql -             ,              

sptrunc.sql -   (truncate)