ORACLE Tip2008. 11. 12. 12:03

SQL -> 
        Parser -> (Parsed Query) -> 
                질의변환기:Query Transformer -> (Transformed Query) -> 
                        비용산정기:Estimator -> (Query + Estimates) -> 
                                실행계획 생성기:Plan Generator -> (Query Plan) -> 
                                        Row Source Generator
     
- 사용자가 실행한 SQL은 데이터 딕셔너리를 참조하여 파싱을 수행
- 옵티마이져는 파싱 결과를 이용해 논리적으로 적용 가능한 실행계획 형태를 선택하고, 힌트를 감안하여 
  일차적으로 잠정적인 실행계획들을 생성
- 데이터 딕셔너리의 통계정보(데이터의 분포도, 테이블 저장구조, 인덱스 구조, 파티션 형태, 비교연산자) 등을 감안하여 
  각 실행계획의 비용을 계산
- 실행계획들의 산출된 비용을 비교하여 가장 최소의 비용을 가진 실행계획을 선택(최저가 입찰 방식이므로 항상 최적의 
  결정이라고만 할 수는 없음)

1) 질의 변환기 (Query Tranformer)
: 보다 양호한 실행계획을 얻을 수 있도록 적절한 SQL 형태를 변환하는 것.

뷰병합 : View Merging
: 뷰 정의 시에 지정한 쿼리(뷰쿼리)를 엑세스가 수행행되는 쿼리(엑세스쿼리)에 병합(Merge)
- 수행시킨 기준으로 뷰에 지정한 부분만 보정하므로 뷰로 발생되는 불이익이 크게 감소
- 엑세스 쿼리의 조건들이 제 역할을 할 수 있고, 뷰 쿼리의 조건까지 추가
- 그러나 몇 가지 제한요소가 있어 이를 준수하지 않으면 뷰병합은 불가능

조건절 진입 : Predicate Pusing
: 뷰 병합을 할 수 없는 경우를 대상으로 뷰쿼리 내부에 엑세스쿼리의 조건절을 진입시키는 질의 변환
- 엑세스쿼리를 뷰쿼리로 진입시키는 방법
- 이렇게 가능한 모든 방법을 동원해서 부여 조건을 뷰쿼리 내에 최대한 반영시켜 보다 양호한 실행계획을 유도

서브쿼리 비내포화 : Subquery Unnesting
: 서브쿼리는 경우에 따라서 내표관계를 해제하여 조인형식으로 대체함으로써 보다 양호한 수행속도를 얻을 수 있음.
- 실제로 대부분의 서브쿼리는 논리적으로 가능하다면 이러한 변환을 거침
- 서비쿼리 비내포화가 불가능하면 서브쿼리를 먼저 수행하거나 나중에 수행하는 실행계획을 수립
- 서브쿼리가 수행되는 순서에 따라서 수행속도에 매우 큰 차이가 나타날 수 있음

실체뷰의 쿼리 재생성 : Query Rewrite
: 실체뷰는 테이블과 밀접한 논리적 관계를 가진 물리적 집합이므로 최적의 집합을 처리하도록 쿼리를 재생성
- 일종의 확장된 뷰병합 기능
- 상황에 따라 어떤 물리적 집합을 엑세스할 것인지 고민할 필요가 없으므로 매우 유용한 기능
- 실체뷰의 쿼리 재생성은 비용 기준에 의해 결정 (테이블 엑세스가 적은 비용을 가지면 쿼리 재생성 하지 않음)

OR 조건의 전개 : OR expansion
: OR 조건이 처리주관 조건이 되면 여러 개의 단위 쿼리로 분기하고 UNION ALL로 연결하는 질의로 변환
- 단지 체크 조건으로만 사용되는 경우에 이와 같은 전개가 발생하면 오히려 큰 비효율이 발생
- 옵티마이져는 비용기준에 의해 전개여부를 결정

사용자 정의 바인드 변수 엿보기 : Peeking
: 쿼리 내에 사용자가 조건절에 지정한 바인드 변수가 있을 때 최초에 수행될 때 적용되었던 값을 이용해 실행계획을 수립하고,
  다음 수행부터는 공유하는 방법이다.


2) 비용 산정기 (Estimator)

선택도 : Selectivity
: 대상 집합에서 해당 조건을 만족하는 로우가 차지하는 비율
- 선택도 판정 단위는 개별 컬럼이 아니라 해당 엑세스를 주관할 수 있는 조건들.
- 선택도는 0.0 ~ 1.0 사이의 값을 갖도록 생성
- 0.0 은 대상 집합에서 전혀 존재하지 않는다는 것을 의미
- 1.0 은 모든 대상 집합이 모두 해당된다는 것을 의미
- 선택도의 값이 낮다는 것은 전체에서 차지하는 비율이 낮다는 것, 이는 곧 변별력이 좋다(읽을 양이 적다)는 것을 의미
- 좋은 선택도를 가진 것을 처리주관으로 결정하면 보다 적은 처리 범위를 엑세스
예>
SELECT *
FROM EMP
WHERE DEPTNO = 20
  AND JOB = 'CLERK'
  AND ENAME LIKE 'SMITH%'
EMP Table 의 인덱스 : 선택도
- EMPNO     : 해당사항 없슴.
- ENAME      : 0.02 (2%)
- DEPTNO + JOB   : 0.1 (10%)
- FULL SCAN     : 1.0 (100%)

카디널리티 : Cardinality
: 판정 대상이 가진 결과 건수 혹은, 다음 단계로 들어가는 중간결과 건수
- 산정방법 : 선택도(Selectivity)와 전체 로우수(Num_rows)로 계산
카디널리티가 필요한 이유
- 선택도는 단지 비율일 뿐임. 백만건의 1%와 백 건의 1%는 비율은 같지만 절대량은 같지 않다.
- 같은 대상 집합에 대해서는 비율만으로도 충분하다.
- 그러나 만약 조인의 순서나 방향 등의 결정을 위해 먼저 수행될 집합을 선택해야 한다면 비율만으로는 결정 할 수 없다.
  
비용 : Cost 
: 실행계획 상의 각 연산들을 수행할 때 소요 시간비용을 상대적으로 계산한 예측치
- 산정방법 : 통계정보에 CPU와 메모리 상황, 디스트 I/O 비용도 고려하여 계산
- 동일한 평가결과의 우선순위 결정은 규칙기준의 경우 로우 캐시(Cache)에 나타난 순서로 비용기준은 인덱스명의 ASCII 값으로 한다.
신뢰의 한계성
- 비용산정 과정에서 수많은 가정들을 세우고 다양한 계산식을 적용
- 그러나 가정들이 완벽할 수 없는 불완전한 가정이므로 때로는 잘못된 비용을 산정하게 되는 한계가 발생
- 이런 문제의 보완을 위해서 다양한 힌트들과 다양한 초기화 파라미터들이 계속 추가되고 있다.  (옵티마이져의 진화)


3) 실행계획 생성기 (Plan Generator)
: 쿼리를 처리할 수 있는 적용 가능한 실행계획을 선별하고, 그들에 대한 비교검토를 거쳐 가장 최소의 비용을 가진 것을 선택
- 최적화에 최대한의 사간을 투자 한다면 조금 더 나은 실행계획을 얻을 수 있을지는 모르지만 이로 인한 부하가 전체 수행시간에 너무 많은 비중을 차지한다면 결코 적절하다고 할 수 없다.
- 모든 경우를 다 검토할 수는 없다 따라서 적응적 탐색(Adaptive Search)과 경험적(Heuristic) 기법을 적용하여 초기치를 선택(Cutoff)하는 전략을 사용한다.

적응적 탐색 : Adaptive Search
- 쿼리수행의 총 예상수행시간에 대해 최적화를 하는 시간이 일정비율을 넘지 않도록 하는 탐색 전략
- 마치 대국시간이 짧은 속기바둑의 제한시간과 대국 시간이 1-2일인 세계대회의 제한시간이 다르게 부여되는 것과 매우 유사함.

경험적 선택 : Heuristic Cutoff
- 탐색도중이더라도 최적이라고 판단되는 실행계획을 발견하면 더 이상 진행하지 않고 멈추는 것)
- 최적이거나 최소한 아주 좋은 실행계획일 것이라고 판단되는 실행계획들의 일정량을 선별하고 정렬한후에 그 중에서 가장 양호한 것을 선택

출처 : 새로쓴 대용량 데이터베이스 솔루션 vol.1

Posted by 항아리고미
책장2008. 11. 12. 10:35




2008.5  ★★★★

열한명의 일하는 엄마들이 쓴 희망의 육아보고서.

일하는 엄마로서 한명한명이 쓴 글들이 너무 나도 공감이 갔다.
아이를 낳고, 직장생활을 한다는것이 너무 힘들다는것을 몸으로 느끼면서..
주변에 나의 이러한 감정들을 공유할 수 있는 사람도..
그럴만한 시간적 여유(?)도 없었던 나에게
다른사람들도 이렇게 저렇게 살고 있구나 하는
세상과 소통하고 있다는 마음이 들게 했던 책이었다.

열한명의 엄마들이 하나같이 주장하는것은.
아이들은 스스로 클수 있다는 믿음.
그것이 가장 큰 소득이 이었다.

다른 일하는 엄마들에게 추천하고 싶기도 하지만.
무엇보다도 우리 신랑에게 가장 추천하고 싶은 책이다.

Posted by 항아리고미
ORACLE Tip2008. 11. 12. 10:30
특정 SQL의 실행계획 번번히 바뀌는 경우가 발생하였다.
바뀔때 plan이 이상하게 풀릴경우 응답시간이 10분을 초과하는 일이 발생하여.
특정 SQL에서 plan을 고정시킬때 오라클에서는 stored outlines 를 제공한다.
 
-- outline 생성  (동적 SQL에 대한 plan 고정)
create or replace outline mlb_bp_contract_1  for category mlb
on
SELECT /*+ NO_MERGE(A) NO_PUSH_PRED(A) */ A.SERVICE_CODE, A.SERVICE_NAME,
    DECODE(C.POTTERY, 'O', DECODE(C.PC_CODE, :1, DECODE(NVL(B.SERVICE_CODE, 'NULL'), 'NULL', 'X', DECODE(A.MUSIC_CODE, 'NULL', 'X', 'O')), 'X'),
                        DECODE(NVL(B.SERVICE_CODE, 'NULL'), 'NULL', 'X', DECODE(A.MUSIC_CODE,'NULL', 'X', 'O')))  SERVICE_STATUS,
    (SELECT DECODE(COUNT(1), 0, 'X', 'O') FROM TMLBG010 WHERE MUSIC_CODE = :2 AND SERVICE_CODE = A.SERVICE_CODE AND PC_CODE = :3) CONTENTS_STATUS
FROM (
   SELECT NVL(C.MUSIC_CODE, 'NULL') MUSIC_CODE, S.SERVICE_CODE, S.SERVICE_NAME
   FROM TMLBC010 C, TMLBS010 S
   WHERE C.MUSIC_CODE(+) = :4
     AND C.SERVICE_CODE(+) = S.SERVICE_CODE
     AND C.PC_CODE1(+) IS NOT NULL
     AND C.PC_CODE2(+) IS NOT NULL
     AND C.PC_CODE3(+) IS NOT NULL
) A, (
   SELECT SERVICE_CODE
   FROM TMLBS050
   WHERE USER_ID=:5
     AND SERVICE_YN = 'Y'
) B, (
   SELECT MUSIC_CODE, SERVICE_CODE, PC_CODE, 'O' POTTERY
   FROM TMLBC050
   WHERE MUSIC_CODE = :6
     AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN START_DATE AND END_DATE
     AND USE_YN = 'Y'
) C
WHERE A.SERVICE_CODE = B.SERVICE_CODE(+)
  AND A.SERVICE_CODE = C.SERVICE_CODE(+);
==> Outline created.   
       
-- 생성한 outline 조회         
select * from user_outlines;
-- 처음에는 USED 값이 UNUSED 로 지정되어있다.

-- outline에 저장된 SQL의 plan확인.
select * from user_outline_hints;

-- 생성한 outline이 여러개 일때 그중 특정 category의 outline을 사용                  
alter system set use_stored_outlines = mlb;
 
--  특별한 session에 outline을 적용하고자 한다면 아래를..
alter session set use_stored_outlines = mlb;

-- use_stored_outlines 를 한후에 저장된 SQL을 실행하고 나서 user_outlines 테이블의 USED 컬럼 값이 USED로 바뀌면 outline이 제대로 사용됨을 확인 할 수 있다.
 
참고로 outline을 생성하고자 할때는 생성할 수 있는 권한을 가지고 있어야 한다.

Posted by 항아리고미

요즘 현준이는 한참 숨바꼭질 놀이에 빠져있다.

엄마도 덩달아 요즘은 숨바꼭질 놀이에 재미가 붙었다.
왜냐면 숨어있는 현준이와 아빠를 찾아내는 스릴과
찾을때 아빠의 요상한 표정이 현준이보다 엄마를 더 놀래키기 때문에.. ㅋㅋ

어제도 물론 숨바꼭질 놀이를 하였다.
이번에는 아빠가 찾고 엄마랑 현준이는 숨고~

몇번을 반복하다가
현준이의 아지트(침대위 커튼속)에 오자
현준이는 금새 숨바꼭질 놀이를 잊고
아지트 속에서 창밖의 붕붕이를 찾기에 바쁘다~

아빠도 그런 현준이를 보더니 숨바꼭질 놀이에 시들해졌나..??
잠시 거실 TV앞으로 간다~

커텐속 창문을 통해 각자의 집으로 들어가는 붕붕이 들을 보고 있는데
아빠가 현준이를 다시 찾으러 왔다~ 
"현준이 어디 갔나..??  어~  현준이가 어디갔지~~??"
그때까지만 해도 재잘대던 현준이가 급 조용해 지더니
지금까지 숨어있기라도 한듯이
조용히 나의 무릎에 앉아서 숨을 죽이고 있다~

아빠가 계속 찾아댄다~
"현준아~~  어~  현준이 어디 갔지..??"
"현준아~~~"
가만히 숨죽이고 숨어있는 현준.

그때
아빠가 갑자기
"현준아 아빠 사랑해?" 하고 물으니
현준이가 바로 "응~" 대답을 해버렸다.
그런 현준이가 얼마나 이쁘던지... 
신랑이와 나는 한참을 웃고야 말았다.
무슨 영문인지 몰라 덩달아 웃는 현준이.. 
헛웃음 소리다.. ㅋㅋㅋ

아~  어찌 안 이뻐 할수 있단말인가..??

Posted by 항아리고미

현준이가 얼마전부터 거실 바닥에 색칠을 하기 시작했다..
급기야 TV에도...
 
항상 무언가를 잘못했으면
일 저지른곳으로 손을 끌고 가서는
뭔가 잘못되었다는 표정으로
"어..~ @$%&#(~~" 머라했던 현준이..
(이는 아마도 자기가 이렇게 일을 저질렀으니 해결해 달라는 얘기인듯싶다)
 
그랬던 현준이가..
얼마전부터는 반응이 바뀌었다.
 
"이거 누가 그랬어?" 하고 내가 꾸짖듯 물어보면
"언니가~" 이러는거다..
그뒤로는 "이거 누가 그랬어?" 하면 어김없이 "언니가~" 다..
 
처음엔 그냥 넘겼는데..
점점 더 심해지는것 같아.. 슬쩍 걱정이 될쯔음.
아침에 신랑이 웃으면서 이러는거다..
"이제 알았어~"
(무턱대고 뭘 알았다는거지..?)
 
신랑이 현준이를 안고서 무엇을 하다가
벽에 걸려있는 현준이 사진을 가리키며 이거 누구야?  하고 물으니깐 "언니~" 이러더란다..
할머니, 할아버지 도 똑바로 부르는 아이였는데...
이상해서 현준이를 가리키며 "이거는?" 하고 물으니 "언니~" 라고 하더란다..
 
여기서 잠깐.
우리가 "현준이 어디써?"  하고 물으면 현준이는 자기 자신을 가리켰었다
 
그동안 현준이가 "언니~" 라고 대답했던건 "현준이~" 라고 말하던거였다고..
 
가만 들어보니..
"언" 을 "헌" 이라 발음하는것도 같았다..
ㅋㅋ
 
이런 반전이 있을수가..
 
현준이에게 미안했다..
엄마는 그것도 모르고 "어~  이거 현준이가 했는데 왜 자꾸 언니가 했다구 하지~"  하고 현준이를 나무랬는데...
 
미안하다 현준아~~
흐..  앞으로 얼마나 더 미안해야 할 일들이 있을런지... ㅋㅋ
Posted by 항아리고미

* 감자채 카레볶음
주재료 : 감자채(350g), 양파(1/2), 홍피망, 청피망 약간씩
양념재료 : 카레가루(2), 소금, 후추가루, 통깨
채썬 감자는 찬물에 두어번 헹궈 전분기를 빼주고, 물에 잠시 5분 정도 담가 나머지 전분까지 빼주고,
전분기가 빠진 감자는 체에 밭쳐 물기를 빼주세요.

> 이거 해놓고 먹는이가 없어서..  내가 혼자 다 먹음.. -_-;;   생각보다는 맛나두만..
> 아버님, 어머님, 신랑이는 야채를 별로 좋아하지 않으시는듯...

* 단호박 갈치 조림
주재료 : 갈치(3토막), 단호박(1/6), 무(100g), 양파(1/2), 풋고추(1), 홍고추(1/2), 대파(1/4)
국물재료 : 멸치다시다 육수(2컵)
양념장재료 : 고추장(1), 고춧가루(2), 간장(1), 청주(2), 다진마늘(1), 설탕(0.7), 생강즙이나 가루 약간, 후춧가루 약간, 소금(적당량)
뚜껑열고 5분정도 팔팔 끓이다가 중불이나 약불로 바꾸어 뭉근히 조려줍니다. 

> 이거이거  대박난 요리.
> 신랑이 밥두공기 먹어주고..  간만에 대박냈네~ 했다.. ㅋㅋ

* 어묵조림
주재료 : 어묵(300g), 마늘(2쪽), 통깨(1), 참기름(약간)
양념재료 : 간장(1), 조선간장(1), 설탕(1/2), 물엿(3), 맛술(2), 물(1컵)
어묵은 뜨끗한 물에넣어 바락바락 씻어준다. 씻은 어묵은 채치고 기름넣고 살짝 볶아준다음에..
양념재료와 마늘쪽 넣고 팔팔 끓으면 볶아둔 어묵넣고 국물이 졸아들때까지 센불에서 바짝조리기 깨와 참기름 넣고 마무리 



> 이건 밥잘안먹는 우리 현준이가 잘 주워먹었던거..
> 누가 내 아들 아니랄까봐..  오뎅을 심히 좋아한단 말야.. ㅋㅋ

* 뚝배기달걀찜
주재료 : 달걀(3개), 새우젓(0.7), 소금(0.2), 물(1+1/4)
부재료 : 대파, 후춧가루

> 매번 물중탕으로 끓였는데 뚝배기에 물넣고 끓이다가 달걀 풀은걸 넣는 방법이라고 해서 한번 해본것임.
> 음식점서 나오는 푸짐하고 맛난 달걀찜이 될 줄알았는데...  아니였다.. --;;;

이거다 둥이맘에서 퍼온 레시피임.
Posted by 항아리고미