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분 가까이 걸렸다.