2016-06-03 5 views
0

거대한 Oracle Trace 파일이 있습니다. 이 파일을 제작 한 응용 프로그램은 1 시간 15 분 실행됩니다. 이 Tracefile에서 찾은 시간 4 한 시간에 조금씩 런타임을 선택합니다. 문제는 이러한 선택 항목이 최적화 프로그램에서 샘플링된다는 것입니다.oracle db trace의 동적 샘플 쿼리

SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE 
    NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') 
    NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_00"), 
    NVL(SUM(C2),:"SYS_B_01") 
FROM 
(SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("LST_G") FULL("LST_G") 
    NO_PARALLEL_INDEX("LST_G") */ :"SYS_B_02" AS C1, CASE WHEN 
    "LST_G"."SENDUNG_TIX"=:"SYS_B_03" AND "LST_G"."LST_K"=:"SYS_B_04" AND 
    "LST_G"."LST_ART"=:"SYS_B_05" AND "LST_G"."FAK_TIX"=(-:"SYS_B_06") THEN 
    :"SYS_B_07" ELSE :"SYS_B_08" END AS C2 FROM "TMS1033"."LST_G" SAMPLE BLOCK 
    (:"SYS_B_09" , :"SYS_B_10") SEED (:"SYS_B_11") "LST_G") SAMPLESUB 


call  count  cpu elapsed  disk  query current  rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 56076  3.93  4.21   0   0   0   0 
Execute 56076  1.98  1.80   0   0   0   0 
Fetch 56076 1127.54 1122.77  222 46487004   0  56076 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 168228 1133.45 1128.79  222 46487004   0  56076 

이것은 네 가지 중 하나입니다. 거의 같습니다. 나는 원래 문장을 발견하고 이것들이 Uniface-Service로부터 실행된다고 생각한다. 나는 Uniface가 어떻게 작동하는지 전혀 모른다. 나는 db 남자 일 뿐이다. 문제는 내가 옵티마이 저가이 문장을 재구성하는 이유가 없다는 것입니다. 원래 하나는 dynamic_sample 힌트를 사용하지 않습니다. 또한 나는 이것들을 발견했다, 나는 그렇게 생각한다, 원본 Statments는 추가로 추적 파일에있다.

select count(*) 
from 
lst_g where sendung_tix = 10330805990396 and lst_k = 'E' and lst_art = 'G' 
    and fak_tix = -4 

왜 이러한 샘플링 된 문장이 있는지 확실하지 않습니다. 어떤 생각?

고마워요.

답변

1

해당 쿼리에 대해 동적 샘플링이 설정되어 있습니다. 어느

  1. 쿼리는 /*+ DYNAMIC_SAMPLING */ 힌트
  2. 코드는 alter session set optimizer_dynamic_sampling= 명령
  3. OPTIMIZER_DYNAMIC_SAMPLING가 데이터베이스 SPFILE에서 설정 문제 사용합니다.

    alter session set OPTIMIZER_DYNAMIC_SAMPLING = 2; 
    

    예를 들어

그런 다음 인덱스를 사용할 수있는 매우 선택적 (그러나 정확한) 조건과 큰 테이블에 대해 쿼리를 실행합니다.

select * from mtl_system_items /* biiig table */ 
where organization_id = 92 
and segment1 LIKE 'DY_' /* very selective condition with index */ 

실행하면 데이터가 빨리 반환됩니다. 그러나,

alter session set OPTIMIZER_DYNAMIC_SAMPLING = 10; 

과 같은 SELECT를 다시 실행하고 테이블의 모든 블록을 샘플링, 점심에게 있습니다.

+0

설명해 주셔서 감사합니다. – hat

-1

통계 수집 작업에서 데이터베이스 개체 통계를 업데이트하는 데 사용되는 쿼리라고 생각합니다. 추적 파일이 생성 된 시점에 통계 수집/업데이트 작업이 실행되고 있는지 확인하십시오.

귀하의 경우, 게시 된 SQL에서 통계가 "TMS1033"에 수집 된 것 같습니다. "LST_G". 다른 3 개의 SQL을 찾은 경우도 마찬가지입니다.

희망이 도움이됩니다.

+0

죄송합니다. 투표가 싫지만이 점은 옳지 않습니다. 이러한 쿼리는 DBMS_STATS가 아닙니다. 동적 샘플링을 수행하는 옵티마이 저의 것입니다. 당신은 (A) OPT_DYN_SAMP 주석을 쿼리에서, 그리고 (B) 쿼리가 테이블의 특정 컬럼에 WHERE 절을 가지고 있다는 사실을 알 수 있습니다. DBMS_STATS는 모든 행에서 샘플링합니다 (where 절, 샘플 크기 제외). –