2012-04-20 2 views
1

위브 DB를 여러 작업을 할 필요가있다, 그래서 모든 SQL 문이오라클 하드 구문 분석

BEGIN 
DELETE FROM...WHERE A=?.. 
UPDATE TABLE...WHERE B=?.. 
END; 

같은 BEGIN-END를 블록에 묶 그러나 많은 검토가이 발생합니다 말했다 PreparedStatement로 어려운 구문 분석. 내 이해에서 열심히 구문 분석은 SQL은 공유 풀에서 다음 구문, 실행 계획을 찾을 수 없습니다 .. 다시 계산할 필요가 있지만, 여기 오라클은 개별 SQL 문으로 그들을 취급해서는 안됩니다. 주어진 SQL 문에서 oracle이 하드 구문 분석을 수행하는지 여부를 어떻게 알 수 있습니까?

답변

7

바인드 변수는 단지뿐만 아니라 PL/SQL 블록에서 작동 :

여기에 설명하고 어떻게되는지 보여주는 좋은 동영상입니다.

루프에서 간단한 명령문을 실행하여 테스트하고 v$sesstat의 구문 분석 횟수를 살펴볼 수 있습니다.

삽입 및 삭제에 사용할 간단한 테이블을 만듭니다. 초기 구문 분석 횟수를 가져옵니다. 항상 열심히 분석하지 않는 바인드 변수와

begin 
    for i in 1 .. 10000 loop 
     execute immediate 'insert into test1 values('||i||')'; 
    end loop; 
    commit; 
end; 
/

select value, name 
from v$sesstat natural join v$statname 
where sid = sys_context('userenv', 'sid') 
    and name in ('parse count (total)', 'parse count (hard)'); 

10072 parse count (total) 
10007 parse count (hard) 

PL/SQL 블록 :

create table test1(a number); 

--Flush the pool, or else this test won't be repeatable. 
alter system flush shared_pool; 

select value, name 
from v$sesstat natural join v$statname 
where sid = sys_context('userenv', 'sid') 
    and name in ('parse count (total)', 'parse count (hard)'); 

47 parse count (total) 
5 parse count (hard) 

이 하드 파싱의 모습입니다. 구문 분석 횟수는 누적되며 여기에서 약간만 증가합니다.

begin 
    for i in 1 .. 10000 loop 
     execute immediate 
     'begin 
      delete from test1 where a = :i; 
     end;' 
     using i; 
    end loop; 
    commit; 
end; 
/

select value, name 
from v$sesstat natural join v$statname 
where sid = sys_context('userenv', 'sid') 
    and name in ('parse count (total)', 'parse count (hard)'); 

10106 parse count (total) 
10019 parse count (hard) 
3

세션을 추적하여 코드를 실행하십시오. tkprof를 실행하고 구문 분석 번호를 확인하십시오.

바인드 변수를 사용합니까? 리터럴을 사용합니까?

- 바꾸기 - 리터럴을 사용할 때 구문 분석이 발생하는 요인 중 하나이기 때문에 바인딩 변수를 사용하는 것이 좋습니다. 리터럴을 변경하면 실제로 바인딩이 사용됩니다. 그들은 SQL 문에서와 OLTP Performance - The Trouble with Parsing

관련 문제