태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'Grant'에 해당되는 글 1건

  1. 2008.12.11 Grant와 Cursor Invalidation

Grant와 Cursor Invalidation

오라클 2008.12.11 15:36
지난 주에 동일한 질문을 두 번이나 받았다.
그래서 블로그를 통해서 공유한다.

질문은 다음과 같다.


Grant를 수행
했더니 갑자기 Library Cache에서 경합이 발생하고 성능 저하 현상이 생겼다. 왜 그런가?


답은 간단하다.

Grant는 DDL이고 Cursor를 Invalidation시킨다.


따라서 Hard Parse를 유발하고 Library Cache에서의 경합을 유발한다.

아주 간단한 Test로 이를 증명할 수 있다.

-- Table t1을 만든다.
drop table t1 purge;

create table t1(c1 int, c2 int);

-- Synonym syn1을 만든다.
create or replace public synonym syn1 for t1
;

-- Function func1을 만든다.
create or replace function func1(v1 int)
return number
is
  v_value int;
begin
  select max(c2) into v_value
  from t1
  where c1 = v1
  ;
 
  return v_value + 1;
end;
/


다음과 같은 세 개의 Query를 수행한다. 첫번째 Query는 Table t1에 대해 Dependency를, 두번째 Query는 Table t1과 Function func1에 대해서 Dependency를, 세번째 Query는 Syonym syn1에 대해 Dependency를 가진다.

select /*+ grant_test1 */
  c1, c2
from t1
;

select /*+ grant_test2 */
  c1, func1(c1)
from t1
;

select /*+ grant_test3 */
  c1, c2
from syn1
;


Query를 수행하고 나면 다음과 같이 Library Cache에 등록되어 있다.

with s1 as (select count(*) as case1
  from v$sql
  where sql_text like 'select /*+ grant_test1 */%'
), s2 as (select count(*) as case2
  from v$sql
  where sql_text like 'select /*+ grant_test2 */%'
), s3 as (
  select count(*) as case3
  from v$sql
  where sql_text like 'select /*+ grant_test3 */%'
)
select case1, case2, case3
from s1, s2, s3
;

     CASE1      CASE2      CASE3   
---------- ---------- ----------   
         1          1          1   

                                    
Table을 t1에 대해 Grant를 수행하면?

grant select on t1 to ukja2;


Query 1, 2, 3 가 모두 Invalid상태이다.

     CASE1      CASE2      CASE3     
---------- ---------- ----------     
         0          0          0    
 

Synonym syn1에 대해 Grant를 수행하면

grant select on syn1 to ukja2;


역시 Query 1, 2, 3가 모두 Invalid상태이다.

     CASE1      CASE2      CASE3 
---------- ---------- ---------- 
         0          0          0 


반면 Function func1에 대해 Grant를 수행하면

grant execute on func1 to ukja2;


Invaldiation이 발생하지 않는다.

     CASE1      CASE2      CASE3 
---------- ---------- ---------- 
         1          1          1
 

Grant 명령은 아주 단순해 보이지만 위의 예를 통해 알 수 있듯이 Cursor Invalidation 관점에서 문제를 일으킬 소지를 안고 있다. 또한 LCO에서도 경합을 일으킬 수 있다.

모든 것은 조심스럽게!!!



신고
tags :
Trackbacks 2 : Comment 0

Write a comment

티스토리 툴바