행위

"오라클 실행계획 수집"의 두 판 사이의 차이

DB CAFE

(새 문서: = 오라클 실행 계획 수집 = == GV$SQL 뷰에서 검토 대상을 추출하는 SQL == <source lang=sql> SELECT PARSING_USER_ID, SQL을 수행한 사용자 ID: ...)
 
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
22번째 줄: 22번째 줄:
 
   AND MODULE NOT LIKE '%sqlservr.exe%'
 
   AND MODULE NOT LIKE '%sqlservr.exe%'
 
   AND MODULE NOT LIKE '%SQL Developer%'
 
   AND MODULE NOT LIKE '%SQL Developer%'
  AND MODULE NOT LIKE '%oracle@mid01 (TNS V1-V3)%'
 
  AND MODULE NOT LIKE '%oracle@hvocidb01ud (TNS V1-V3)%'
 
  AND MODULE NOT LIKE '%oracle@hscerpdb (TNS V1-V3)%'  /* 제외할 SQL 텍스트 정보 */'
 
 
   AND SQL_FULLTEXT NOT LIKE '%DBMS_%' AND SQL_FULLTEXT NOT LIKE 'EXEC % ';
 
   AND SQL_FULLTEXT NOT LIKE '%DBMS_%' AND SQL_FULLTEXT NOT LIKE 'EXEC % ';
 
</source>
 
</source>
55번째 줄: 52번째 줄:
 
     BEGIN v_commit := 'COMMIT';
 
     BEGIN v_commit := 'COMMIT';
 
     FOR r_sql IN c_sql
 
     FOR r_sql IN c_sql
     LOOP BEGIN v_schema := 'ALTER SESSION SET CURRENT_SCHEMA = '||r_sql.PARSING_SCHEMA_NAME;
+
     LOOP  
    v_sql_text := 'EXPLAIN PLAN SET STATEMENT_ID= '''|| r_sql.SQL_ID || ''' INTO PLAN_TABLE_TUN FOR ' || r_sql.SQL_TEXT;
+
        BEGIN  
    v_sql_err := 'INSERT INTO KHCHOI.ERR_SQL(sql_ id, sql_err) VALUES(''' || r_sql.SQL_ID|| '''';
+
          v_schema := 'ALTER SESSION SET CURRENT_SCHEMA = '||r_sql.PARSING_SCHEMA_NAME;
    EXECUTE IMMEDIATE v_schema;
+
          v_sql_text := 'EXPLAIN PLAN SET STATEMENT_ID= '''|| r_sql.SQL_ID || ''' INTO PLAN_TABLE_TUN FOR ' || r_sql.SQL_TEXT;
    EXECUTE IMMEDIATE v_sql_text;
+
          v_sql_err := 'INSERT INTO KHCHOI.ERR_SQL(sql_ id, sql_err) VALUES(''' || r_sql.SQL_ID|| '''';
    EXCEPTION
+
       
          WHEN OTHERS THEN EXECUTE IMMEDIATE v_sql_ err||','''||SUBSTR(SQLERRM, 11, 200)||''')';
+
          EXECUTE IMMEDIATE v_schema;
  END;
+
          EXECUTE IMMEDIATE v_sql_text;
    EXECUTE IMMEDIATE v_commit;
+
   
 +
          EXCEPTION
 +
            WHEN OTHERS THEN EXECUTE IMMEDIATE v_sql_ err||','''||SUBSTR(SQLERRM, 11, 200)||''')';
 +
          END;
 +
     
 +
      EXECUTE IMMEDIATE v_commit;
  
 
   END LOOP;
 
   END LOOP;
69번째 줄: 71번째 줄:
 
</source>
 
</source>
  
== 튜닝 검토 대상 필터링 ==
+
== 시스템간 튜닝 검토 대상 필터링 ==
 
* /* 서로 다른 시스템에서 수집된 실행 계획 비교 */
 
* /* 서로 다른 시스템에서 수집된 실행 계획 비교 */
 
<source lang=sql>
 
<source lang=sql>
 
SELECT A.SQL_ID as SQL_ID
 
SELECT A.SQL_ID as SQL_ID
       ,NVL(A.ID, B.ID) as 현행_실행계획_ID
+
       ,NVL(A.ID, B.ID) as 개발DB_실행계획_ID
       ,A.OPERATIONS as 현행_실행계획_내용
+
       ,A.OPERATIONS as 개발DB_실행계획_내용
       ,NVL(B.ID, A.ID) as 미래_실행계획_ID
+
       ,NVL(B.ID, A.ID) as 운영DB_실행계획_ID
       ,B.OPERATIONS as 미래_실행계획_내용
+
       ,B.OPERATIONS as 운영DB_실행계획_내용
 
   FROM (SELECT SQL_ID
 
   FROM (SELECT SQL_ID
 
               ,ID
 
               ,ID
 
               ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
 
               ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
           FROM 현행_수집_실행계획) A
+
           FROM 개발DB_수집_실행계획) A
 
         FULL OUTER JOIN
 
         FULL OUTER JOIN
 
         (SELECT SQL_ID
 
         (SELECT SQL_ID
 
                 ,ID
 
                 ,ID
 
                 ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
 
                 ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
           FROM 미래_수집_실행계획) B
+
           FROM 운영DB_수집_실행계획) B
 
         ON (A.SQL_ID = B.SQL_ID AND A.ID = B.ID)
 
         ON (A.SQL_ID = B.SQL_ID AND A.ID = B.ID)
 
  WHERE TRIM(A.OPERATIONS) <> TRIM(B.OPERATIONS)
 
  WHERE TRIM(A.OPERATIONS) <> TRIM(B.OPERATIONS)
92번째 줄: 94번째 줄:
 
     OR B.SQL_ID IS NULL ;
 
     OR B.SQL_ID IS NULL ;
 
</source>
 
</source>
 +
[[Category:oracle]]

2021년 11월 12일 (금) 09:50 기준 최신판

thumb_up 추천메뉴 바로가기


1 오라클 실행 계획 수집[편집]

1.1 GV$SQL 뷰에서 검토 대상을 추출하는 SQL[편집]

SELECT PARSING_USER_ID,      /* SQL을 수행한 사용자 ID */
       PARSING_SCHEMA_NAME , /* SQL을 수행한 사용자명 */
       SQL_ID,               /* SQL ID */
       SQL_FULLTEXT          /* SQL 텍스트 전체 내용 */
       PLAN_HASH_VALUE,      /* SQL의 실행계획 해시 값 */
       CASE
            WHEN BIND_DATA IS NULL THEN 'N'
            ELSE 'Y'
       END BIND_DATA         /* 바인드 변수 정보 유무 */
       EXECUTIONS,           /* 수행 횟수 (DBMS 기동 후) */
       CHILD_NUMBER          /* SQL의 버전 번호 */
  FROM GV$SQL
 WHERE PARSING_SCHEMA_NAME NOT IN ('SYS','SYSMAN','SYS TEM','MAXGAUGE') /* 시스템 스키마 제외 */
   AND COMMAND_TYPE IN ('3')
   /* SELECT 유형 SQL만 추출 */
   /* 제외할 모듈 정보 (개발자 SQL 툴 또는 비업무성 계정이 수행한 SQL 등) */
   AND MODULE NOT LIKE '%Orange for ORACLE%'
   AND MODULE NOT LIKE '%sqlservr.exe%'
   AND MODULE NOT LIKE '%SQL Developer%'
   AND SQL_FULLTEXT NOT LIKE '%DBMS_%' AND SQL_FULLTEXT NOT LIKE 'EXEC % ';

1.2 AWR에서 SQL 실행 계획 추출[편집]

SELECT SQL_ID
       ,PLAN_HASH_VALUE,
       ,ID
       ,PARENT_ID
       ,OPERATION
       ,OPTION
       ,OBJECT_NAME
  FROM DBA_HIST_SQL_PLAN
 WHERE (SQL_ID, PLAN_HASH_VALUE) IN (SELECT SQL_ID, PLAN_HASH_VALUE FROM 튜닝검토대상);


1.3 PL/SQL 이용한 TO-BE 시스템에서의 실행 계획 수집[편집]

CREATE TABLE PLAN_EXEC_ERR (SQL_ID VARCHAR2(100), ERROR_TEXT VARCHAR2(1000));
     DECLARE v_schema VHARCHAR2(32);
     v_sql_text CLOB;
     v_commit VARCHAR2(32);
     v_sql_err VARCHAR2(100);
     CURSOR c_sql IS SELECT SQL_ID,
                            SQL_TEXT,
                            PARSING_SCHEMA_NAME
                       FROM 튜닝검토대상SQL;
     BEGIN v_commit := 'COMMIT';
     FOR r_sql IN c_sql
     LOOP 
        BEGIN 
          v_schema := 'ALTER SESSION SET CURRENT_SCHEMA = '||r_sql.PARSING_SCHEMA_NAME;
          v_sql_text := 'EXPLAIN PLAN SET STATEMENT_ID= '''|| r_sql.SQL_ID || ''' INTO PLAN_TABLE_TUN FOR ' || r_sql.SQL_TEXT;
          v_sql_err := 'INSERT INTO KHCHOI.ERR_SQL(sql_ id, sql_err) VALUES(''' || r_sql.SQL_ID|| '''';
        
          EXECUTE IMMEDIATE v_schema;
          EXECUTE IMMEDIATE v_sql_text;
    
          EXCEPTION
            WHEN OTHERS THEN EXECUTE IMMEDIATE v_sql_ err||','''||SUBSTR(SQLERRM, 11, 200)||''')';
          END;
      
       EXECUTE IMMEDIATE v_commit;

   END LOOP;
   END;

1.4 시스템간 튜닝 검토 대상 필터링[편집]

  • /* 서로 다른 시스템에서 수집된 실행 계획 비교 */
SELECT A.SQL_ID as SQL_ID
       ,NVL(A.ID, B.ID) as 개발DB_실행계획_ID
       ,A.OPERATIONS as 개발DB_실행계획_내용
       ,NVL(B.ID, A.ID) as 운영DB_실행계획_ID
       ,B.OPERATIONS as 운영DB_실행계획_내용
  FROM (SELECT SQL_ID
               ,ID
               ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
          FROM 개발DB_수집_실행계획) A
        FULL OUTER JOIN
        (SELECT SQL_ID
                ,ID
                ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
           FROM 운영DB_수집_실행계획) B
        ON (A.SQL_ID = B.SQL_ID AND A.ID = B.ID)
 WHERE TRIM(A.OPERATIONS) <> TRIM(B.OPERATIONS)
 /* 실행계획이 다름을 비교하는 부분 */
    OR A.SQL_ID IS NULL
    OR B.SQL_ID IS NULL ;