SQL 실행 순서

SQL 기본 2016. 12. 23. 08:53

SQL 실행 순서를 의외로 모르시는 분들이 있는 거 같네요..


기본 SQL

SELECT    DEPTNO, SUM(SAL)             5

FROM      EMP                          1

WHERE    JOB = ‘SALESMAN’              2

GROUP BY DEPTNO                        3

HAVING  SAL > 2000                     4  

ORDER BY DEPTNO                        6



조인이 있는 SQL (DRIVING TABLE :EMP)

SELECT E.EMPNO, E.ENAME, D.DNAME      5

FROM EMP E, DEPT D        1

WHERE E.DEPTNO = D.DEPTNO                3

AND E.JOB = ‘SALESMAN’           2

AND D.LOC = ‘NEW YORK’                4

'SQL 기본' 카테고리의 다른 글

ROLLUP, CUBE, GROUPING SET 의 원리_작성중  (0) 2017.01.05
블로그 이미지

마스터오라클

오라클 성능 튜닝에 관해 STUDY한 자료를 정리하는 블로그입니다.

,

DBMS_XPLAN 활용

튜닝 2016. 12. 23. 08:24

 

**************************************************************************************************

* 실행계획 및 Row Source별 수행통계 시 설정(한개이상 설정필요)

**************************************************************************************************


/* 1. Hint 추가(Row Source execution정보를 활성화) - 추천*/

/*+GATHER_PLAN_STATISTICS*/ 


/* 2. 세션설정 - 추천사항 아님 개발용으로나 사용*/

ALTER SESSION SET STATISTICS_LEVEL = ALL;

/* 참고사항> _ROWSOURCE_EXECUTION_STATISTICS 파라미터값을TRUE로 변경*/


*************************************************************************************************** DBMS_XPLAN.DISPLAY_CURSOR(단일 SQL문에 대해 실제 수행된 실행계획 보여주는 Function) ==> (예측실행계획만 확인 시, DBMS_XPLAN.DISPLAY 사용)


1. FUNCTION PARAMETER

    - DBMS_XPLAN.DISPLAY_CURSOR(SQL_ID, ChildNumber, FORMAT)

       ;NULL,NULL 인경우 가장 최근에 실행된 쿼리의미(SQL ID, ChildNumber 입력 시, 특정쿼리지정) 


2. FORMAT 옵션

2-1. 예측내용

         - BASIC, TYPICAL, ALL, OUTLINE, ADVANCED 


      2-2. 실측내용

          - 가장많은 정보나타내는 옵션   : advanced allstats last


          - 쿼리변형없는 단순쿼리 튜닝 시 : allstats last -rows +predicate (실행통계, Row수(E-row)생략, Predicate Information출력)


          - 쿼리변형이 발생 또는 복잡한 쿼리 튜닝시    : allstats last -rows +alias +outline +predicate (실행통계, Row수(E-row)생략, 쿼리블럭추가, 힌트정보출력, Predicate Information출력)


  3. Query Optimizer Estimations 항목(옵티마지어의 예상치)

      - E-rows        : 각 Operation이 끝났을 때 Return되는 건수

      - E-Bytes       : 각 Operation이 Return한 Byte수

      - Cost (%CPU)   : 각 Operation의 Cost

      - E-Time        : 수행시간


  4. Runtime statistics항목(실제수행시간 및 실제수행건수)

      - Starts        : 각 Operation을 반복 수행한건수(NL조인의 경우 조인횟수)

      - A-Rows        : 각 Operation이 Return 한 건수

      - A-Time        : 각 실제실행시간


  5. I/O statistics(I/O관련하여 Read/Write한 Block수)

      - Buffers       : 각 Operation이 Memory에서 읽은 수

      - Reads         : 각 Operation이 Disk에서 Read한 Block수(예지에서는 나타나지 않음)

      - Writes        : 각 Operation이 Disk에서 Write한 Block수(예지에서는 나타나지 않음)

**************************************************************************************************


/* 1. 가장많은 정보나타내는 옵션*/

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL, 'advanced allstats last'));

  

/* 2. 쿼리변형없는 단순쿼리 튜닝 시*/

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL, 'allstats last -rows +predicate'));

  

/* 3. 쿼리변형이 발생 또는 복잡한 쿼리 튜닝시*/

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL, 'allstats last -rows +alias +outline +predicate'));



ADVANCED 옵션이면 튜닝에 필요한 모든 정보 나옴


**************************************************************************************************

 Row Source별 수행통계 조회 SQL 

 - 파라미터 : SQL_ID, CHILD_NUMBER

**************************************************************************************************

/* 1. Row Source별 수행통계 전체내역 조회 SQL */

SELECT a.LAST_OUTPUT_ROWS "Rows"

     , a.*

  FROM V$SQL_PLAN_STATISTICS_ALL a

 WHERE SQL_ID = '3p0bf0usv002s'

   AND CHILD_NUMBER = 0

ORDER BY ID;

/* 2. Row Source별 수행통계 조회 SQL(컬럼가공) */

WITH V1 AS (

           SELECT VP.ID PID,

                  NVL(SUM( VP1.LAST_CR_BUFFER_GETS ),0) SUM_LIO,

                  NVL(SUM( VP1.LAST_ELAPSED_TIME), 0) SUM_ELA

           FROM   V$SQL_PLAN_STATISTICS_ALL VP ,

                  V$SQL_PLAN_STATISTICS_ALL VP1

           WHERE  VP.SQL_ID = :SQL_ID

           AND    VP.CHILD_NUMBER= :CHDNUM

           AND    VP.SQL_ID = VP1.SQL_ID(+)

           AND    VP.CHILD_NUMBER=VP1.CHILD_NUMBER(+)

           AND    VP.ID = VP1.PARENT_ID(+)

           GROUP  BY VP.ID

     ),

     V2 AS (

            SELECT MAX( VP.LAST_CR_BUFFER_GETS ) MAX_LIO ,

                   MAX( VP.LAST_ELAPSED_TIME ) MAX_ELA

            FROM   V$SQL_PLAN_STATISTICS_ALL VP

            WHERE  VP.SQL_ID = :SQL_ID

            AND    VP.CHILD_NUMBER= :CHDNUM

     )

SELECT /*+ OPT_PARAM('PARALLEL_EXECUTION_ENABLED', 'FALSE') */ /* EXEC_FROM_DBMS_XPLAN */

       ID,

       DEPTH ,

       POSITION ,

       PARENT_ID,

       LPAD(' ', DEPTH*2       )||OPERATION||' '||OPTIONS OPERATION,

       OBJECT_NAME NAME,

       CARDINALITY E_ROWS ,

       OUTROWS A_ROWS ,

       CRGETS "LIO_SIGMA(BLOCK)",

       CRGETS - (SELECT SUM_LIO FROM V1 WHERE V1.PID=A.ID) "LIO_DELTA(BLOCK)",

       ROUND((CRGETS - (SELECT SUM_LIO FROM V1 WHERE V1.PID=A.ID))/(SELECT MAX_LIO FROM V2)*100,1) "LIO_RATIO(%)",

       ROUND(ETIME/1000000,2) "ELA_SIGMA(SEC)",

       ROUND((ETIME  - (SELECT SUM_ELA FROM V1 WHERE V1.PID=A.ID))/1000000,2) "ELA_DELTA(SEC)",

       ROUND((ETIME  - (SELECT SUM_ELA FROM V1 WHERE V1.PID=A.ID))/(SELECT MAX_ELA FROM V2)*100,1) "ELA_RATIO(%)"

FROM   (

        SELECT 

               VP.ID ID ,

               VP.DEPTH DEPTH ,

               VP.POSITION POSITION ,

               VP.OPERATION OPERATION ,

               VP.OPTIONS OPTIONS ,

               VP.PARENT_ID PARENT_ID,

             --  VP.COST COST ,

             --  VP.TIME TIME ,

               VP.CARDINALITY CARDINALITY ,

             --  VP.BYTES BYTES ,

             --  VP.OBJECT_NODE OBJECT_NODE ,

               VP.OBJECT_NAME OBJECT_NAME ,

             --  VP.TEMP_SPACE TEMP_SPACE ,

               VP.LAST_STARTS STARTS ,

               VP.LAST_OUTPUT_ROWS OUTROWS ,

               VP.LAST_CR_BUFFER_GETS CRGETS ,

             --  VP.LAST_CU_BUFFER_GETS CUGETS ,

             --  VP.LAST_DISK_READS READS ,

             --  VP.LAST_DISK_WRITES WRITES ,

               VP.LAST_ELAPSED_TIME ETIME --,

             --  VP.ESTIMATED_OPTIMAL_SIZE MEM_OPT ,

             --  VP.ESTIMATED_ONEPASS_SIZE MEM_ONE ,

             --  VP.LAST_MEMORY_USED LAST_MEM_USED ,

             --  VP.LAST_EXECUTION LAST_MEM_USAGE ,

             --  VP.OPTIMAL_EXECUTIONS OPT_CNT ,

             --  VP.ONEPASS_EXECUTIONS ONE_CNT ,

             --  VP.MULTIPASSES_EXECUTIONS MULTI_CNT ,

             --  VP.MAX_TEMPSEG_SIZE MAX_TMP ,

             --  VP.LAST_TEMPSEG_SIZE LAST_TMP

        FROM   V$SQL_PLAN_STATISTICS_ALL VP

        WHERE  VP.SQL_ID = :SQL_ID

        AND    VP.CHILD_NUMBER= :CHDNUM

       ) A;

 

 


 

 

----- Original Message -----

From : 이은상/웹&모바일 

To : 이금율/상품/자원

Sent : 2016-11-17 15:44:03

 

ITH v1 AS (

           SELECT vp.id pid,

                  nvl(SUM( vp1.last_cr_buffer_gets ),0) sum_lio,

                  nvl(SUM( vp1.last_elapsed_time), 0) sum_ela

           FROM   v$sql_plan_statistics_all vp ,

                  v$sql_plan_statistics_all vp1

           WHERE  vp.sql_id = :sql_id

           AND    vp.child_number=0

           AND    vp.sql_id = vp1.sql_id(+)

           AND    vp.child_number=vp1.child_number(+)

           AND    vp.id = vp1.parent_id(+)

           GROUP  BY vp.id

     ),

     v2 AS (

            SELECT MAX( vp.last_cr_buffer_gets ) max_lio ,

                   MAX( vp.last_elapsed_time ) max_ela

            FROM   v$sql_plan_statistics_all vp

            WHERE  vp.sql_id = :sql_id

            AND    vp.child_number=0

     )

SELECT /*+ opt_param('parallel_execution_enabled', 'false') */ /* EXEC_FROM_DBMS_XPLAN */

       id,

       depth ,

       position ,

       parent_id,

       lpad(' ', depth*2       )||operation||' '||options Operation,

       object_name name,

       cardinality e_rows ,

       outrows a_rows ,

       crgets "LIO_SIGMA(BLOCK)",

       crgets - (select sum_lio from v1 where v1.pid=a.id) "LIO_DELTA(BLOCK)",

       round((crgets - (select sum_lio from v1 where v1.pid=a.id))/(select max_lio from v2)*100,1) "LIO_RATIO(%)",

       round(etime/1000000,2) "ELA_SIGMA(SEC)",

       round((etime  - (select sum_ela from v1 where v1.pid=a.id))/1000000,2) "ELA_DELTA(SEC)",

       round((etime  - (select sum_ela from v1 where v1.pid=a.id))/(select max_ela from v2)*100,1) "ELA_RATIO(%)"

FROM   (

        SELECT 

               vp.id id ,

               vp.depth depth ,

               vp.position position ,

               vp.operation operation ,

               vp.options options ,

               vp.parent_id parent_id,

             --  vp.cost cost ,

             --  vp.time TIME ,

               vp.cardinality cardinality ,

             --  vp.bytes bytes ,

             --  vp.object_node object_node ,

               vp.object_name object_name ,

             --  vp.temp_space temp_space ,

               vp.last_starts starts ,

               vp.last_output_rows outrows ,

               vp.last_cr_buffer_gets crgets ,

             --  vp.last_cu_buffer_gets cugets ,

             --  vp.last_disk_reads reads ,

             --  vp.last_disk_writes writes ,

               vp.last_elapsed_time etime --,

             --  vp.estimated_optimal_size mem_opt ,

             --  vp.estimated_onepass_size mem_one ,

             --  vp.last_memory_used last_mem_used ,

             --  vp.last_execution last_mem_usage ,

             --  vp.optimal_executions opt_cnt ,

             --  vp.onepass_executions one_cnt ,

             --  vp.multipasses_executions multi_cnt ,

             --  vp.max_tempseg_size max_tmp ,

             --  vp.last_tempseg_size last_tmp

        FROM   v$sql_plan_statistics_all vp

        WHERE  vp.sql_id = :sql_id

        AND    vp.child_number=0

       ) a;

  

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

아래는 다음 링크에 있슴 (유명한 오동규님의 블로그)

http://scidb.tistory.com/entry/About-DBMSXPLAN-1%EC%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D   

  

최근의 많은수의 사람들이 DBMS_XPLAN 패키지를 사용하여 튜닝을 하고 있다.

필자는 DBMS_XPLAN 패키지에 대한 너무많은 질문공세 때문에 아예 블로그에 올릴 결심을 하였다.

오늘은 DBMS_XPLAN 패키지에 대한 첫번째 이야기로 가장중요한 실행계획에 대하여 조목조목 따져보려고 한다.


DBMS_XPLAN 패키지는 9i 부터 점점 발전하여 지금은 Trace + tkprof 보고서와 자웅을 겨룰 정도로 발전하고 

있다.

DBMS_XPLAN 패키지내의 함수는 10g R2 기준으로 6개 이지만 가장 자주 사용하는 함수는 아래의 3가지 이다.


1.DISPLAY                 --> 예측 실행계획을 보여준다.

2.DISPLAY_CURSOR   --> 실제 실행된 실행계획을 보여준다.

3.DISPLAY_AWR         --> 실제 실행된 실행계획을 보여준다.


오늘의 주제는 실행계획상의 각항목에 대한 설명이므로 3개의 함수에 대한 자세한 설명은 다음에 계속하여 

연재할 계획이다.


실행계획은 패키지 내의 3가지 함수(display, display_cursor, display_awr)를 통해 모두 조회가 가능하다.

아래의 스크립트는 display_awr 의 예제이며 sql_id 만 구하면 언제든지 실행될수 있다.


select * from table(dbms_xplan.display_awr(:v_sql_id,null,null,'advanced allstats last'));




사용자 삽입 이미지





위 PLAN 은 DBMS_XPLAN 패키지의 format 항목을 Advanced 로 했을 경우에 나타나는 Plan 의 모습이다.

아래는 위의 Plan 항목 하나하나에 대한 자세한 설명이다.

물론 위의 예제는 실행계획의 모든 항목이 나온것은 아니다.

예를 들면 파티션테이블을 사용하지 않았으므로 Partiton 관련 항목이 빠진것이다.


DBMS_XPLAN 패키지의 실행계획의 항목은 아래처럼 크게 7개로 나눌수 있다.

주의사항:

파랑색부분( 5), 6), 7)번 에해당됨)은 실행통계가 있을경우만 해당된다.

display_cursor, display_awr 의  경우 statistics_level 파라미터를 all 로 설정하거나 SQL 에 gather_plan_statistics 를 사용한경우 실행통계를 볼수 있다.

 

1)Basics 항목 (Always Available)

Id                :각 Operation 의 ID 임.

                  * 가 달려있는 경우는 predicate 정보에 access 및 filter 에 관한정보가 나옴을 표시한것임.

Operation  : 각각 실행되는 JOB 을 나타냄

                    row source operation.의 줄임말임.

Name          : Operation 이 엑세스하는 테이블 및 인덱스를 나타냄.


2)Query Optimizer Estimations(옵티마이져의 예상 row 수 및 bytes, cost , temp 사용량)

Rows (E-Rows)  : 각 operation 이 끝났을 때 return되는 건수를 나타냄.

                              이것은 예측 건수 이므로 실제 건수와는 다름.

Bytes (E-Bytes) : 각 operation 이 return 한 byte 수.

                              예상치 이므로 실제 받은 byte와는 다름

TempSpc             : 각 operation. 이 temporary space 를 사용한 양(예상치임)

Cost (%CPU)      : 각 operation 의 Cost. (예상치 임)

                              괄호안의 내용은 CPU Cost 의 백분율임.

                               이값은 Child Operation 의 Cost 를 합친 누적치임.

Time                     : 예측 수행시간

 

3)Partitioning (파티션을 엑세스 할경우만 나타남)

Pstart  : 파티션을 엑세스 하는경우 시작파티션을 나타냄

             상수로 들어올때는 파티션 번호로 나타나며 변수로 들어올때는 KEY 로 나타남

Pstop  : 마지막 파티션을 나타냄.

              따라서 patart, pstop 를 이용하면 access 한 파티션을 알수 있음. 


4)Parallel and Distributed Processing (Parallel Processsing 을 사용하거나 DB-LINK 를 사용하는경우)

Inst         :  DB-LINK 명(사용하는 경우만 나타남).

TQ            :  PARALLEL SQL 사용시 table queue 명을 나타냄

                   TQ 는 PARALLEL SLAVE 간의 통신을 담당함.

IN-OUT      :  Parallel processing 시에 각각의 Operation 이 Serial 로 실행되는지 parallel 로 진행되는지를

                     나타냄.

PQ Distrib :  Parallel processing 시에 producers 와 consumers 간의 데이터의 분배방식을 나타냄.


* 이부분의 자세한 내용은 아래를 참조하기 바란다.

1.http://scidb.tistory.com/entry/Parallel-Query-의-조인시-Row-Distribution

2.http://scidb.tistory.com/entry/Parallel-Query-의-조인시-또다른-튜닝방법pxjoinfilter 



5)Runtime Statistics (실제 수행시간밑 실제수행건수)

Starts     : 각 operation 을 try 한 건수(예를 들어 nested loop join 이라면 인덱스를 여러 번 scan 함)

A-Rows  : 각 operation 이 return 한 건수

A-Time   : 실제 실행시간

0.1초까지 나타남 (HH:MM:SS.FF).

                 이값은 Child Operation 의 Cost 를 합친 누적치임.             

 

6)I/O Statistics (I/O 관련하여 READ / WRITE 한 블록수)

Buffers  : 각 Operation 이 메모리에서 읽은 block 수.

Reads   :각 Operation 이 disk 에서 읽은 block 수.

Writes   : 각 Operation 이 disk 에 write한 block 수.

 

7)Memory Utilization Statistics(hash 작업이나 sort 작업시 사용한 메모리 통계)

OMem         : optimal execution 에 필요한 메모리(예측치임).

1Mem          : one-pass execution. 에 필요한 메모리(예측치임)

O/1/M        : 각 operation 이 실행한 optimal/one-pass/multipass 횟수가 순서대로 표시됨.

Used-Mem : 마지막 실행시의 사용한 메모리

Used-Tmp  : 마지막 실행시 메모리가 부족하여 temporary space 를 대신 사용할 때 나타남. 

                      보이는값에 1024 를 곱해야함.

                      예를들어 32K 로 나타나면 32MB 를 의미함.

Max-Tmp    : 메모리가 부족하여 temporary space 를 사용할 때 최대 temp 사용량임.

                     USED-TMP 와 다른점은 마지막 수행시가 아니라 SQL을 여러 번 수행했을경우에 

                     항상 최대값만 보인다는 것이다.

                     보이는값에 1024 를 곱해야함.

                     예를들어 32K 로 나타나면 32MB 를 의미함.

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

'튜닝' 카테고리의 다른 글

v$sql을 이용한 통계 보기  (0) 2016.12.26
v$system_event  (0) 2016.12.26
DBMS_MONITOR 활용 (특정 세션이나 모듈에 트레이스걸기)  (0) 2016.12.22
눈여겨 볼만한 대기 이벤트들  (0) 2016.12.22
TKPROF 사용 기본  (0) 2016.12.22
블로그 이미지

마스터오라클

오라클 성능 튜닝에 관해 STUDY한 자료를 정리하는 블로그입니다.

,

1.사용가능한 DBMS 패키지

 select *

    from dba_objects

   where object_name like 'DBMS%'

     and object_type = 'PACKAGE' ORDER BY OBJECT_NAME;


2. 계정에서 못찾을때는 권한을 주자 (개인테스트)

grant alter session to scott;

3. dbms 모니터 실행권한 주기

GRANT EXECUTE ON dbms_monitor TO PUBLIC;


4. 서비스 명을 알아낸다.

show parameter service_name;


5. 모듈 및 액션 
SELECT  SID, SERVICE_NAME, MODULE, ACTION
FROM    V$SESSION
WHERE   SERVICE_NAME <> 'SYS$BACKGROUND';



SQL Trace 사용 방법 - 다른세션에서 트레이스


(1) 9i에서

exec dbms_system.set_ev(145, 3, 10046, 12, '');

=> 시리얼 번호가 3인 145번 세션에서 레벨 12로 10046 이벤트 트레이스


(2) 10g

(시작)

begin

dbms_monitor.session_trace_enable(

session_id=>145, serial_num=>3,

waits=>TRUE, binds=>TRUE);

end;

/


(해제)

begin

dbms_monitor.session_trace_disable(

session_id=>145, serial_num=>3);

end;

/


(3) oradebug 명령어

oradebug help

oradebug setospid 3796

oradebug unlimit /* 트레이스 파일의 크기를 없앰 */

oradebug event 10046 trace name context forever, level 8

oradebug tracefile_name /* 트레이스 파일 이름 확인 */

oradebug event 10046 trace name context off /* 트레이스 해제 */

oradebug close_trace



SQL Trace 사용 방법 - Service, Modele, Action 단위로 트레이스 걸기- 10g

- show parameter service_name;

- /* 서비스나 모듈 이름 보는 방법 */

select sid, service_name, module, action

from v$session

where service_name <> 'SYS$BACKGROUND';


(1) 세션에 거는 방법 - 세션 이름이 eCRM인 세션에 모두 트레이스 걸기

begin

dbms_monitor.serv_mod_act_trace_enable(

service_name=>'eCRM',

module_name=>dbms_monitor.all_modules,

action_name=>dbms_monitor.all_actions,

waits=>true, binds=>true);

end;

/



(트레이스 설정 확인)

select primary_id service_name, qualifier_id1 module, qualifier_id2 action,

waits, binds

from dba_enabled_traces;



(트레이스 해제)

begin

dbms_monitor.serv_mod_act_trace_disable(

service_name=>'eCRM',

module_name=>dbms_monitor.all_modules,

action_name=>dbms_monitor.all_actions);

end;

/



(2) 모듈에 거는 방법

(모듈 이름 바꾸기)

begin

dbms_application_info.set_module(

module_name=>'emp manager',

action_name=>'select emp');

end;

/


(확인)

select sid, service_name, module, action

from v$session

where service_name <> 'SYS$BACKGROUND';


(모듈에 걸기)

begin

dbms_monitor.serv_mod_act_trace_enable(

service_name=>'eCRM', module_name=>'emp manager',

action_name=>dbms_monitor.all_actions,

waits=>true, binds=>true);

end;

/


(트레이스 설정 확인)

select primary_id service_name, qualifier_id1 module, qualifier_id2 action,

waits, binds

from dba_enabled_traces;


(트레이스 해제)

begin

dbms_monitor.serv_mod_act_trace_disable(

service_name=>'eCRM', module_name=>'emp manager',

action_name=>dbms_monitor.all_actions);

end;

/



(실행 중 부분 모듈에 걸기)

..

dbms_application_info.set_action('update emp');

..

begin

dbms_monitor.serv_mod_act_trace_enable(

service_name=>'eCRM', module_name=>‘emp manager',

action_name=>'update emp',

waits=>true, binds=>true);

end;

/


select primary_id service_name, qualifier_id1 module, qualifier_id2 action,

waits, binds

from dba_enabled_traces;

(특정값으로 설정된 세션에만 트레이스 걸기)

- 설정

exec dbms_session.set_identifier('oraking');

- 트레이스 걸기

begin

dbms_monitor.client_id_trace_enable(

client_id=>'oraking',

waits=>false, binds=>false);

end;

/



오라클 성능 고도화

'튜닝' 카테고리의 다른 글

v$system_event  (0) 2016.12.26
DBMS_XPLAN 활용  (0) 2016.12.23
눈여겨 볼만한 대기 이벤트들  (0) 2016.12.22
TKPROF 사용 기본  (0) 2016.12.22
SQL Trace 위치 찾는 스크립트  (0) 2016.12.22
블로그 이미지

마스터오라클

오라클 성능 튜닝에 관해 STUDY한 자료를 정리하는 블로그입니다.

,