<aside> 💡 2023/02/15 21:00 ~ 22:30

</aside>

Untitled

create table BIG_TABLE
(
	id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
	owner varchar2(255) not null,
	object_name varchar2(255) ,
	created DATE not null
);

alter table BIG_TABLE add constraint big_table_pk primary key (id);

--데이터 생성및 부풀리기(1000만건 될 때까지 여러번 실행)
insert into BIG_TABLE (owner, object_name, created) 
select owner, object_name, created FROM all_objects order by dbms_random.value;

--중간중간 갯수세어보세요
select count(*) from BIG_TABLE;

create index x01 on BIG_TABLE(owner, created);

-- 통계정보 수집
begin
  dbms_stats.gather_table_stats
  ( ownname          => USER
  , tabname          => 'BIG_TABLE'
  , estimate_percent => 100
  , block_sample     => true
  , method_opt       => 'for all columns size auto'
  );
end;

select table_name, num_rows, last_analyzed from user_tables where table_name = 'BIG_TABLE'; -- 통계정보 수집여부

-- 실행계획이랑 SQL트레이스 확인해보기
SELECT /*+ gather_plan_statistics */ * from big_table where owner='APPQOSSYS';
SELECT * FROM table(dbms_xplan.display_cursor(null, null, 'allstats last'));

-- 클러스터링팩터 조회쿼리
select INDEX_NAME, TABLE_NAME, CLUSTERING_FACTOR from dba_indexes where table_name = 'BIG_TABLE'; -- pk: 131,952  n1: 7,807,312

Untitled

-- 왜 TFS(TABLE FULL SCAN) / INDEX (FULL/RANGE) SCAN 인가
-- 왜 INDEX FULL SCAN / INDEX RANGE SCAN인가
-- 왜 INDEX 로 (PK / X01) 이 선택됐는가
-- 왜 SORT가 발생해서 전체범위처리가 됐는가
-- 왜 옵티마이저모드를 변경한 것만으로도 index힌트를 사용한 실행계획과 동일한 실행계획을 갖는가
-- 왜 owner='SYS' 와 owner='APPQOSSYS'가 다른 실행결과를 갖는가

A-0    select /*+ 힌트없음 */    * from big_table X order by owner; -- Table Full Scan            [전체범위처리]   5.69s
 A-0-1 select /*+ index(X) */   * from big_table X order by owner; -- index full scan of pk(id)  [전체범위처리] 132.53s
 A-0-2 select /*+ FIRST_ROWS */ * from big_table X order by owner; -- index full scan of x01     [부분범위처리]   0.96s

A-1.   select /*+ 힌트없음    */ * from big_table X                         order by created; --Table Full Scan         [전체범위처리] 
 A-1-1 select /*+ index(X)   */ * from big_table X                         order by created; --Index Full Scan of pk   [전체범위처리]
 A-1-2 select /*+ FIRST_ROWS */ * from big_table X                         order by created; --Table Full Scan         [전체범위처리] 

A-2.   select /*+ 힌트없음    */ * from big_table X where owner='SYS'       order by created; --Table Full Scan         [전체범위처리] 
 A-2-1.select /*+ index(X)   */ * from big_table X where owner='SYS'       order by created; --Index Full Scan of pk   [전체범위처리] 
 A-2-2.select /*+ FIRST_ROWS */ * from big_table X where owner='SYS'       order by created; --Index RangeScan of x01  [부분범위처리]

A-3.   select /*+ 힌트없음    */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]
 A-3-1.select /*+ index(X)   */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]
 A-3-2.select /*+ FIRST_ROWS */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]

B-1.   select /*+  힌트없음    */ * from big_table X                        order by id;     -- Index Full Scan of pk   [부분범위처리] 
 B-1-1.select /*+  index(X)   */ * from big_table X                        order by id;     -- Index Full Scan of pk    [부분범위처리]
 B-1-2.select /*+  FIRST_ROWS */ * from big_table X                        order by id;     -- Index Full Scan of pk    [부분범위처리]
 B-1-3.select /*+  index(X x01) */ * from big_table X                      order by id;     -- Index Full Scan of pk    [전체범위처리]

B-2.   select /*+  힌트없음    */ * from big_table X where owner = 'SYS'    order by id;     -- Index Full Scan of pk    [부분범위처리]
 B-2-1.select /*+  index(X)   */ * from big_table X where owner = 'SYS'    order by id;     -- Index Full Scan of pk    [부분범위처리]
 B-2-2.select /*+  FIRST_ROWS */ * from  big_table X where owner = 'SYS'   order by id;     -- Index Full Scan of pk    [부분범위처리]

(23.02.24추가) -- 성능고도화2권 p.368
A-4.   select /*+ 힌트없음    */ * from big_table X order by owner, created;  --Table Full Scan         [전체범위처리] 
 A-4-1.select /*+ FIRST_ROWS  */ * from big_table X order by owner, created; -- Index Full Scan of x01  [부분범위처리]

Quiz(임상구)

남석현

Quiz 김태훈

select * from DBA_TAB_COLUMNS;

실행통계, 세션통계