STAR TRANSFORMATION ENABLED

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Parameter 정보


Syntax STAR_TRANSFORMATION_ENABLED = TRUE|TEMP_DISABLE|FALSE
설정방법
  • Parameter File
  • ALTER SYSTEM SET STAR_TRANSFORMATION_ENABLED =
  • ALTER SESSION SET STAR_TRANSFORMATION_ENABLED =
버전 및 기본값
9iR2 10gR1 10gR2 11gR1
FALSE FALSE FALSE FALSE



[편집] 설명

Star Transformation을 사용할 지의 여부를 지정한다.

  • TRUE: Star Transformation을 사용한다.
  • TEMP_DISABLE: Star Transformation을 사용하되 Temp Table Transformation 작업(Operation)을 사용하지 않는다. Temp Table Transformation은 Dimension Table을 두번 액세스하는 부담을 줄이기 위해 액세스 결과를 Temp Table에 저장하는 것을 의미한다. 일반적으로 성능에 유리하다. 하지만, 성능에 불리하게 동작하는 경우에는 이 값을 이용해 제어한다.
  • FALSE: Star Transformation을 사용하지 않는다.


[편집] 참고 사항

[편집] Star Transformation

Star Transformation을 사용하려면 다음과 같은 조건을 만족해야 한다.

  • Fact 테이블과 Dimension 테이블로 이루어진 Star Schema를 사용해야 한다.
  • Fact 테이블과 Dimension 테이블은 Parent-Child Relationship을 명시적으로 가져야 한다. 즉, Primary key, Foreign Key Constraint를 부여해야 한다.
  • Fact 테이블의 Dimension Key들은 모두 단일 컬럼으로 이루어진 Bitmap Index을 가져야 한다.


[편집] 예제

Star Transformation을 사용하기 위해서는 다음과 같이 Parent/Child Relationship을 갖는 Star Schema를 구성해야 한다.

-- create objects
-- this is star schema
drop table t_fact purge;
drop table t_dim1 purge;
drop table t_dim2 purge;

create table t_fact(dim1_key int, dim2_key int, dim3_key int, value1 int, value2 int);
alter table t_fact add constraint pk_fact primary key(dim1_key, dim2_key, dim3_key);
create table t_dim1(dim1_key int primary key, value varchar2(20));
create table t_dim2(dim2_key int primary key, value varchar2(20));
alter table t_fact add constraint fk_dim1 
	foreign key (dim1_key)
	references t_dim1(dim1_key);
alter table t_fact add constraint fk_dim2
	foreign key (dim2_key)
	references t_dim2(dim2_key);


-- generate data
-- generate dimension data
insert into t_dim1
select
	level as dim1_key,
	'area'||level as value
from
	dual
connect by level <= 100;

insert into t_dim2
select
	level as dim2_key,
	'code'||level as value
from
	dual
connect by level <= 100;


-- generate fact data
insert /*+ append */ into t_fact
select
	t_dim1.dim1_key,
	t_dim2.dim2_key,
	dummy.dim3_key,
	dbms_random.random as value1,
	dbms_random.random as value2	
from
	t_dim1, t_dim2, 
	(select level as dim3_key from dual connect by level <= 10) dummy
;

commit;

또한 Fact 테이블의 각 Dimension Key들은 Bitmap Index를 가져야 한다.

-- create bitmap index
create bitmap index t_fact_bidx1 on t_fact(dim1_key);
create bitmap index t_fact_bidx2 on t_fact(dim2_key);


-- gather statistics
exec dbms_stats.gather_table_stats(user, 't_dim1', cascade=>true, no_invalidate=>false);
exec dbms_stats.gather_table_stats(user, 't_dim2', cascade=>true, no_invalidate=>false);
exec dbms_stats.gather_table_stats(user, 't_fact', cascade=>true, no_invalidate=>false);


Star Transformation을 사용하지 않을 경우에는 다음과 같은 실행 계획을 따른다.

-- case 1: no star transformation  
-- disable start transformation
alter session set star_transformation_enabled = false;

select /*+ gather_plan_statistics */
	d1.value as area,
	d2.value as code,
	sum(f.value1) as sum_value1,
	max(f.value2) as max_value2,
	count(*) as counts
from
	t_fact f,
	t_dim1 d1,
	t_dim2 d2
where
	f.dim1_key = d1.dim1_key and
	f.dim2_key = d2.dim2_key and
	d1.value like 'area1%' and
	d2.value = 'code1'
group by
	d1.value, d2.value
;
 
 select * from table(dbms_xplan.display_cursor(null, null, 'iostats last'));      
----------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY                  |              |      1 |      9 |     12 |00:00:00.05 |     415 |
|*  2 |   HASH JOIN                     |              |      1 |    119 |    120 |00:00:00.05 |     415 |
|*  3 |    TABLE ACCESS FULL            | T_DIM1       |      1 |     12 |     12 |00:00:00.01 |       7 |
|   4 |    TABLE ACCESS BY INDEX ROWID  | T_FACT       |      1 |    986 |   1000 |00:00:00.03 |     408 |
|   5 |     NESTED LOOPS                |              |      1 |    986 |   1002 |00:00:00.02 |       9 |
|*  6 |      TABLE ACCESS FULL          | T_DIM2       |      1 |      1 |      1 |00:00:00.01 |       7 |
|   7 |      BITMAP CONVERSION TO ROWIDS|              |      1 |        |   1000 |00:00:00.01 |       2 |
|*  8 |       BITMAP INDEX SINGLE VALUE | T_FACT_BIDX2 |      1 |        |      1 |00:00:00.01 |       2 |
----------------------------------------------------------------------------------------------------------
                                                                                                           
Predicate Information (identified by operation id):                                                       
---------------------------------------------------                                                       
                                                                                                          
   2 - access("F"."DIM1_KEY"="D1"."DIM1_KEY")                                                             
   3 - filter("D1"."VALUE" LIKE 'area1%')                                                                 
   6 - filter("D2"."VALUE"='code1')                                                                       
   8 - access("F"."DIM2_KEY"="D2"."DIM2_KEY")                                                             
                                                                                                                                                                                                        

Star Transformation을 사용할 경우에는 다음과 같은 실행 계획을 따른다. Bitmap 연산을 이용해 Dimension 값들을 먼저 추출한 다음, 다시 Dimension 값과 Fact 값을 추출하는 변환 기법을 유심히 관찰해야 한다.


-- case 2: star transformation
alter session set star_transformation_enabled = true;

select /*+ gather_plan_statistics */
	d1.value as area,
	d2.value as code,
	sum(f.value1) as sum_value1,
	max(f.value2) as max_value2,
	count(*) as counts
from
	t_fact f,
	t_dim1 d1,
	t_dim2 d2
where
	f.dim1_key = d1.dim1_key and
	f.dim2_key = d2.dim2_key and
	d1.value like 'area1%' and
	d2.value = 'code1'
group by
	d1.value, d2.value
;

 select * from table(dbms_xplan.display_cursor(null, null, 'iostats last'));      ----------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY                  |              |      1 |      1 |     12 |00:00:00.01 |     106 |
|*  2 |   HASH JOIN                     |              |      1 |      1 |    120 |00:00:00.01 |     106 |
|*  3 |    HASH JOIN                    |              |      1 |      1 |    120 |00:00:00.01 |      99 |
|*  4 |     TABLE ACCESS FULL           | T_DIM2       |      1 |      1 |      1 |00:00:00.01 |       7 |
|   5 |     TABLE ACCESS BY INDEX ROWID | T_FACT       |      1 |    119 |    120 |00:00:00.01 |      92 |
|   6 |      BITMAP CONVERSION TO ROWIDS|              |      1 |        |    120 |00:00:00.01 |      32 |
|   7 |       BITMAP AND                |              |      1 |        |      1 |00:00:00.01 |      32 |
|   8 |        BITMAP MERGE             |              |      1 |        |      1 |00:00:00.01 |       9 |
|   9 |         BITMAP KEY ITERATION    |              |      1 |        |      1 |00:00:00.01 |       9 |
|* 10 |          TABLE ACCESS FULL      | T_DIM2       |      1 |      1 |      1 |00:00:00.01 |       7 |
|* 11 |          BITMAP INDEX RANGE SCAN| T_FACT_BIDX2 |      1 |        |      1 |00:00:00.01 |       2 |
|  12 |        BITMAP MERGE             |              |      1 |        |      1 |00:00:00.01 |      23 |
|  13 |         BITMAP KEY ITERATION    |              |      1 |        |     12 |00:00:00.01 |      23 |
|* 14 |          TABLE ACCESS FULL      | T_DIM1       |      1 |     12 |     12 |00:00:00.01 |       7 |
|* 15 |          BITMAP INDEX RANGE SCAN| T_FACT_BIDX1 |     12 |        |     12 |00:00:00.01 |      16 |
|* 16 |    TABLE ACCESS FULL            | T_DIM1       |      1 |     12 |     12 |00:00:00.01 |       7 |
----------------------------------------------------------------------------------------------------------
                                                                                                          
Predicate Information (identified by operation id):                                                       
---------------------------------------------------                                                       
                                                                                                          
   2 - access("F"."DIM1_KEY"="D1"."DIM1_KEY")                                                             
   3 - access("F"."DIM2_KEY"="D2"."DIM2_KEY")                                                             
   4 - filter("D2"."VALUE"='code1')                                                                       
  10 - filter("D2"."VALUE"='code1')                                                                       
  11 - access("F"."DIM2_KEY"="D2"."DIM2_KEY")                                                             
  14 - filter("D1"."VALUE" LIKE 'area1%')                                                                 
  15 - access("F"."DIM1_KEY"="D1"."DIM1_KEY")                                                             
  16 - filter("D1"."VALUE" LIKE 'area1%')                                                                 
                                                                    

[편집] 관련된 정보

  1. Bitmap Join Index


[편집] 외부 참조