본문 바로가기

카테고리 없음

ORACLE 장시간의 HARD PARSING 유발 쿼리

ORACLE 장시간의 HARD PARSING 유발 쿼리

여기서는 하나의 쿼리가 장시간의 수행타임을 가지는 쿼리를 만들어보겠다.

 

1. HARD PARSING

A.   SQL 수행중 발생한다.

B.   PARSING -> BIND -> EXECUTE -> FETCH 과정중 PARSING에 해당한다

C.   위 수행 과정 중에 대부분의 수행시간을 차지한다.

2. HARD PARSING 유발 요인

A.   Literal SQL

B.   적정 크기보다 작은 shared_pool_size

C.   부적절한 SQL

3. HARD PARSING 예제

A.   대량의 table 생성

SQL> spool make.sql

SQL> set serveroutput on

SQL> get m_tbs

  1  declare

  2     temp varchar2(2000);

  3  begin

  4     dbms_output.enable(1000000);

  5     for i in 1..2000 loop

  6             dbms_output.put_line('create table tb'||i||'(id number);');

  7     end loop;

8* end;

SQL>/

(실행…)

SQL> spool off

SQL> set serveroutput off

make.sql 을 확인하고 불필요한 부분 수정 / 삭제

sys가 아닌 일반유저로 접속

( SYSTEM TABLESPACE에 생성하면 후에 삭제하기 번거로워진다.)

스크립트를 실행한다.

SQL>@make

 

B.   생성한 테이블을 JOIN 구문으로 편집한다.

SQL> set serveroutput on

SQL> spool table.sql

SQL> get join

  1  declare

  2     temp varchar2(200);

  3  begin

  4     for i in 1..2000 loop

  5             select 'test.tb'||i||',' into temp from dual;

  6             dbms_output.put_line(temp);

  7     end loop;

  8* end;

PL/SQL procedure successfully completed.

 

SQL> spool off

SQL>set serveroutput off

 

select * from tb1,tb2, …, tb2000; 형태로 만든다.

 

4. 기존에 만들었던 script를 이용해 trace 한다.

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

 

call     count       cpu    elapsed       disk      query    current        rows

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

Parse        2    568.80     555.69          0          0          0           0

Execute      3      0.00       0.00          0          0          0           0

Fetch        1      0.00       0.00          0          3          0           0

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

total        6    568.80     555.70          0          3          0           0

 

Misses in library cache during parse: 1

 

하나 파싱하는데 거의 10분 가까이 걸렸다.