태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

[오라클 질문] Cursor Keep시 Execution Plan도 Keep이 가능한가요?

기술이야기/Ask 엑셈 2010. 3. 22. 10:39
2010-02-17 17:45:59 에 등록된 질문입니다. 강정식 님께서 질문해 주셨습니다.

Q:
안녕하세요?
Cursor Keep 관련해서 문의사항이 있어 글을 올립니다.

제가 현재 지원하고 있는 Site에서 근래에 Hard Parse 비율이 높아져 리소스 과점이 증가하고 수행속도도 오래 걸려 문제가 되고 있습니다.

Hard Parse 비율이 증가하는 이유는 Literal 값이 있어서 그런것은 아니며, 바인드 변수 사용과 여러차례 튜닝을 통해 안정화를 유지하고 있습니다.

그러나, 특정 프로그램에서 사용되는 Cursor의 크기가 커서(참여 Object 약 300개, 실행계획 약 3,000 line) Ageout이 너무 빨리 되기 때문에 재차 Hard Parse하는 비율이 증가하는 것으로 파악되었습니다.

하여 이를 해결하기 위해 아래의 방안 3개를 검토중에 있는데 이에 대해 엑셈에 문의를 드리고자 합니다.

1. SQL Profile 또는 Stored Outline 사용
- Cursor가 큰 프로그램 위주로 위의 2가지를 사용하여 Execution Plan을 고정시키고 이로 인해 Hard Parse 비용을 줄이고자 하였으나, 이 방안도 결국은 비용을 줄이긴 하지만 Ageout된 Plan에 대해 결국 재차 Hard Parse

를 해야 하는 한계에 봉착함을 알게되어 진행을 못하였습니다.

2. Cursor Keep
- Oracle에서 제공하는 특정 Cursor Keep 구문을 통해 무거운 Cursor에 대해 미리 Keep을 시키면 Cursor 및 Execution Plan도 같이 Keep되는 것으로 알고 진행을 하였다가 10g R2 이후부터 Cursor(Heap0 영역)만 Keep이 되

고 Execution Plan(Heap6 영역)은 Keep이 안된다고 하여 이 방법 또한 진행을 못하게 되었습니다.

- 10g R2 이후부터 Execution Plan Keep이 안된다는 내용은 엑셈 백과사전(
http://wiki.ex-em.com/index.php/DBMS_SHARED_POOL.KEEP
)을 참고하였습니다. 여담으로 이에 대해 한국오라클에 문의해보니 Execution Plan Keep

은 10g R2 이전부터도 지원이 안되었다고 하는데 어느 내용이 맞는지 궁금합니다.

3. Ageout되는 비율을 감소시키는 방법은?
- 궁극적으로 Size가 작은 Cursor는 Ageout 되는 비율이 작지만 Size가 큰 Cursor은 Ageout 되는 비율이 커서 문제가 되고 있는 것이므로, 만약 Execution Plan Keep이 안된다면 이를 극복하기 위해 Shared Pool Size를 증

가시키는 방안은 좋은 방안인지 궁금합니다(참고로 제가 지원하는 Site의 Shared Pool Size는 23G 입니다)


위의 질문 내용에 대해 좋은 방안이 있으시면 답변 부탁드리겠습니다.

감사합니다.


A:                                        엑셈 답변 보기

위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클만화] Enq: TM - Contention



[오라클만화] Enq: TM - Contention

  • 김태현 2010.02.24 12:49 ADDR 수정/삭제 답글

    한가지 이야기로 2가지 내용이 담겨 있네요!! ^^
    좋은 내용 감사합니다. ^^

  • Favicon of https://blog.ex-em.com EXEM 2010.02.24 15:31 신고 ADDR 수정/삭제 답글

    감사합니다. 앞으로도 쭉 ~관심가져주세요^^

  • Eddy 2010.03.15 12:03 ADDR 수정/삭제 답글

    참 좋은 만화입니다. 그림도 좋고 스토리도 좋아요. ㅋㅋ

[오라클질문] tkprof의 진실은? oracle 버전 상관없음

기술이야기/Ask 엑셈 2010. 2. 23. 13:12
2010-02-08 14:40:07 에 등록된 질문입니다. 병섭 님께서 질문해 주셨습니다

Q:

질문요지는 tkprof가 예측계획이 나올 수 있는지?
explain 옵션을 사용하면 예측계획인지? 실측계획인지 알고 싶습니다. 원하는 정보를 찾다찾다 이렇게 질문을 올립니다. tkporf에서 explaint옵션을 주면 *.trc파일을 읽어 현재 시간으로 다시 측정한다고 알고있습니다. 그러나 이것이 실측계획인지요? 그것이 가장 궁금합니다. 감사합니다. .... 한줄로 계속 써지네요. ㅡㅡ;








A:                                        엑셈 답변 보기

위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클질문] remote DB에 있는 대량의 테이블을 로컬로 그대로 가져올 때

기술이야기/Ask 엑셈 2010. 2. 23. 13:09

2010-02-02 02:25:46 에 등록된 질문입니다.  엄정훈 님께서 질문해 주셨습니다.

Q:
table001 데이타는 약 3억건 정도 됩니다.
첫번째 방법은 전체를 한꺼번에 가져오기, 두번째 방법은 where절에 range를 주어서 가져오기...
두가지 방법 다 ORA-12801/ORA-02063 메세지가 나오는데요, 인터넷에서 원인을 찾아봐도 딱히 방법이 나오질 않네요.
여러 원인이 있을 수 있겠지만, 저런 oerr의 원인은 어떤 것이 있을까요? table001은 partition되어 있지는 않습니다.


-- SQL
create table tmp_table parallel 4
tablespace test01
unrecoverable
as
select /*+ full(a) parallel(a 4) *
from user_a.table001@tmp_link a
;


-- RESULT
select /*+ full(a) parallel(a 4) */ *
                        *
ERROR at line 5:
ORA-12801: error signaled in parallel query server
ORA-02063: preceding 2 lines from tmp_link


A:                                        엑셈 답변 보기

위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클 질문] 스칼라서브쿼리 사용한 쿼리의 parallel 쿼리 수행 문제

기술이야기/Ask 엑셈 2010. 2. 23. 13:05
 
2010-02-10 12:48:43 에 등록된 질문입니다. 강정우 님께서 질문해 주셨습니다.
Q:
안녕하세요^^

아래 쿼리를 보시면스칼라서브쿼리를 주석으로 막았습니다.


SELECT D.NM ,
       d.jumin_no ,
       c.in_dt ,
       c.adpt_fr_yyyymm ,
       c.adpt_to_yyyymm
--     , (select x.chg_emp_no from tbbhab10 x
--        where d.jumin_no  = x.jumin_no
--          and d.jumin_seq = x.jumin_seq
--          and x.tax_item_cd = '21'
--          and x.adpt_to_yyyymm = '201001'
--          and x.amt > 0
--          and rownum = 1)
FROM   (
       select /*+ no_merge full(z) parallel(z 16) */ z.jumin_no, z.jumin_seq, z.amt ,
z.tax_item_cd, bugwa_seq_no, z.in_dt, z.adpt_fr_yyyymm , z.adpt_to_yyyymm
       from   tbbhab10 z
       where  z.TAX_ITEM_CD       = '21'
          AND z.ADPT_FR_YYYYMM   <= '201001'
          AND z.ADPT_TO_YYYYMM   >= '201001'
          and z.amt               = 1
          and exists ( select /*+ use_nl(d cc) index(cc ix_tbbhab10_03) */ 'Y' from
tbbhab10 cc
                        where cc.jumin_no  = z.jumin_no
                          AND cc.ADPT_FR_YYYYMM   = '201002'
                          AND cc.ADPT_TO_YYYYMM   >= '201002'
                          and cc.tax_item_cd = '21'
                          and cc.amt > 1 )
       ) c ,
       tbjgba20 d   -- Rows=340,962,300  Blocks=9,620,360
WHERE  d.jumin_no          = c.jumin_no
AND    d.jumin_seq         = c.jumin_seq

Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=22K Card=10K Bytes=780K)
   1    0   TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TBJGBA20' (Cost=6 Card=9 Bytes=351)
(PARALLEL_COMBINED_WITH_CHILD)
   2    1     NESTED LOOPS (Cost=22K Card=10K Bytes=780K) (PARALLEL_TO_SERIAL) (QC
(RANDOM))
   3    2       VIEW (Cost=21K Card=1K Bytes=43K) (PARALLEL_COMBINED_WITH_PARENT)
   4    3         NESTED LOOPS (SEMI) (Cost=21K Card=1K Bytes=105K)
(PARALLEL_COMBINED_WITH_PARENT)
   5    4           PARTITION RANGE (ALL) (PARALLEL_COMBINED_WITH_PARENT)
   6    5             TABLE ACCESS (FULL) OF 'TBBHAB10' (Cost=10K Card=42K Bytes=2M)
(PARALLEL_COMBINED_WITH_PARENT)
   7    4           PARTITION RANGE (ITERATOR) (PARALLEL_COMBINED_WITH_PARENT)
   8    7             TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TBBHAB10' (Cost=4 Card=28
Bytes=1K) (PARALLEL_COMBINED_WITH_PARENT)
   9    8               INDEX (RANGE SCAN) OF 'IX_TBBHAB10_03' (NON-UNIQUE) (Cost=3
Card=1) (PARALLEL_COMBINED_WITH_PARENT)
  10    2       PARTITION RANGE (ITERATOR) (PARALLEL_COMBINED_WITH_PARENT)
  11   10         INDEX (RANGE SCAN) OF 'IX_TBJGBA20_02' (NON-UNIQUE) (Cost=3 Card=2)
(PARALLEL_COMBINED_WITH_PARENT)


아래는 스칼라서브쿼리가 있고 인라인뷰에서 parallel을 사용하였습니다.

SELECT D.NM ,
       d.jumin_no ,
       c.in_dt ,
       c.adpt_fr_yyyymm ,
       c.adpt_to_yyyymm
     , (select x.chg_emp_no from tbbhab10 x
        where d.jumin_no  = x.jumin_no
          and d.jumin_seq = x.jumin_seq
          and x.tax_item_cd = '21'
          and x.adpt_to_yyyymm = '201001'
          and x.amt > 0
          and rownum = 1)
FROM   (
       select /*+ no_merge full(z) parallel(z 16) */ z.jumin_no, z.jumin_seq, z.amt ,
z.tax_item_cd, bugwa_seq_no, z.in_dt, z.adpt_fr_yyyymm , z.adpt_to_yyyymm
       from   tbbhab10 z
       where  z.TAX_ITEM_CD       = '21'
          AND z.ADPT_FR_YYYYMM   <= '201001'
          AND z.ADPT_TO_YYYYMM   >= '201001'
          and z.amt               = 1
          and exists ( select /*+ use_nl(d cc) index(cc ix_tbbhab10_03) */ 'Y' from
tbbhab10 cc
                        where cc.jumin_no  = z.jumin_no
                          AND cc.ADPT_FR_YYYYMM   = '201002'
                          AND cc.ADPT_TO_YYYYMM   >= '201002'
                          and cc.tax_item_cd = '21'
                          and cc.amt > 1 )
       ) c ,
       tbjgba20 d   -- Rows=340,962,300  Blocks=9,620,360
WHERE  d.jumin_no          = c.jumin_no
AND    d.jumin_seq         = c.jumin_seq

Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=22K Card=10K Bytes=780K)
   1    0   COUNT (STOPKEY)
   2    1     PARTITION RANGE (SINGLE)
   3    2       TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TBBHAB10' (Cost=5 Card=1
Bytes=45)
   4    3         INDEX (RANGE SCAN) OF 'PK_TBBHAB10' (UNIQUE) (Cost=4 Card=1)
   5    0   TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TBJGBA20' (Cost=6 Card=9 Bytes=351)
   6    5     NESTED LOOPS (Cost=22K Card=10K Bytes=780K)
   7    6       VIEW (Cost=21K Card=1K Bytes=43K)
   8    7         NESTED LOOPS (SEMI) (Cost=21K Card=1K Bytes=105K)
   9    8           PARTITION RANGE (ALL)
  10    9             TABLE ACCESS (FULL) OF 'TBBHAB10' (Cost=10K Card=42K Bytes=2M)
  11    8           PARTITION RANGE (ITERATOR)
  12   11             TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TBBHAB10' (Cost=4 Card=28
Bytes=1K)
  13   12               INDEX (RANGE SCAN) OF 'IX_TBBHAB10_03' (NON-UNIQUE) (Cost=3
Card=1)
  14    6       PARTITION RANGE (ITERATOR)
  15   14         INDEX (RANGE SCAN) OF 'IX_TBJGBA20_02' (NON-UNIQUE) (Cost=3 Card=2)


스칼라서브쿼리와 함께 parallel 을 사용하면 parallel 처리가 안되는되왜 그런가요? 스칼라서브쿼리를 주석처리하고 사용하면 parallel 처리가 잘 됩니다.

A:                        엑셈 답변 보기
 
위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클 질문] Oracle의 Memory 사용량 관련

기술이야기/Ask 엑셈 2010. 1. 19. 10:34
2010-01-08 14:13:52 에 등록된 질문입니다. 신경원 님께서 질문해 주셨습니다.

Q:
안녕하세요 오라클 Memory 관련 궁금증 때문에 질문 올리게 되었습니다.
우선 오라클이 사용하는 Memory는 SGA+PGA라고 알고 있는데요
DB구동 시 설정되어 있는 SGA Size 만큼의 Memory를 차지하고 Session 접속 시
Memory를 할당받는데 이게 PGA 영역으로 Session 종료 시 할당 해제한다고 알고 있는데
이렇게 계산 하는 것이 맞는지요?
Windows에서 SGA를 200MB로 설정해 놓은 DB가 작업매니저로 확인하니
Oracle.exe Process의 Memory 사용량이 약 110MB라서 저 계산이 맞는지 의문이 듭니다. 




A:                                        엑셈 답변 보기
위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클 질문] 오라클 패키지의 마법을 풀어 봅시다 관련 질문 입니다.

기술이야기/Ask 엑셈 2010. 1. 19. 10:29
2009-04-23 16:51:52 에 등록된 질문입니다.  정해교 님께서 질문해 주셨습니다.

Q:
욱짜님의 블로그 를 보다가 "오라클 패키지의 마법을 풀어 봅시다"라는 내용의 글을 접하게 되었습니다.
내용은 패키지를 프로시저나 펑션을 대신하여 사용하면 해당 Object와 관련된 Table에 DDL이 발생 하더라도 패키지 자체는 INVALID상태로 변하지 않아 library cache 관련 이벤트 발생으로 인한 장애 상황을 피할 수 있다는 내용인데요.
저역시 DDL 작업으로 인해 library cache 관련 이벤트로인한 장애를 경험 한지라 관심이 많이 갑니다.

궁금한 사항은 패키지의 경우 패키지 바디 안에 여러개의 프로시저나 펑션을 넣어 로직을 구현 할 수 있는데요.
위와 같이 프로시저나 펑션을 패키지로 변경 할 때 패키지 바디 안의 프로시저는 한개씩만 구현을 해야하는지 아니면 여러개의 프로시저를 넣어 구현해도 같은 효과를 볼 수 있는지 궁금 합니다.
단순한 생각으로는 패키지 바디 안에 여러개의 프로시저를 넣어 구현 한경우 DDL 발생시 패키지 바디만 Invalid 상태로 빠져 SQL문장의 리컴파일은 없다고 하더라도 다른 문제가 생기지 않을 까하는 생각이 들어서 문의 합니다.
감사 합니다.

A:                      엑셈 답변 보기               
위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클 질문] row cache

기술이야기/Ask 엑셈 2010. 1. 19. 10:24
2009-12-21 21:13:08 에 등록된 질문입니다.  이루마 님께서 질문해 주셨습니다.

Q:

안녕하세요.

기초적인 질문 올리겠습니다.

- row cache : dictionary 정보를 저장
- library cache : sql 실행에 필요한 모든 정보 관리(sql, table, procedure....)

여기서 SELECT * FROM T1; 이란 쿼리가 있다고 하면...

row cache와 library cache 모두 T1에 대한 정보를 저장 할 것으로 보이는데요...

row cache와 library cache는 각각 어떤 정보를 저장하고 있는건가요?

그리고 서로 어떤 관계가 있는 걸까요?

더불어 alter table T1; 을 실행 하였을때,,, row cache의 정보도 변경 되나요?

상세한 설명 부탁드려도 될련지요?

감사합니다...


A:                         엑셈 답변 보기
위 글은 (주) 엑셈 온라인 서비스 ASK EXEM 에서 발췌한 것임을 알려 드립니다.

[오라클만화] latch: Cache Buffers LRU Chain


latch: Cache Buffers LRU Chain
  • podong28@gmail.com 2010.01.20 23:07 ADDR 수정/삭제 답글

    LRU 리스트를 탐색할때 Cold 영역에서 Hot영역으로 탐색한다는데....좀 이해가 않되는 부분입니다. 자주 사용되는 버퍼를 찾기위해서는 많이사용하고있는 Hot영역을 먼저 탐색해서 찾는게 더 빨리 찾을거라고 생각되는데요.

    왜 Cold영역부터 찾고 Hot영역으로 찾아 나서는지요?

  • grace 2010.01.22 13:02 ADDR 수정/삭제 답글

    LRU 리스트의 탐색은 Physical Reads 시에 이루어집니다. 프리버퍼를 얻기위해 탐색하기 때문입니다. ^^
    버퍼캐시에 찾으려는 버퍼가 없다면, 프리 버퍼를 할당 받아서 블록을 올려야겠지요? (Physical Reads)
    LRU List의 Cold 영역은 예전에 사용되거나 자주 사용되지 않는 버퍼입니다.
    그래서 Cold 영역부터 탐색하여 프리버퍼를 얻어오는 것입니다.
    자주 사용되는 버퍼는 Physical Reads를 최소화하기 위해서 버퍼캐시에 머물러야 하고,
    이는 hot 영역에 위치할 가능성이 높습니다.

[오라클만화] Write Complete Waits

[오라클만화] Write Complete Waits