Oracle 11g OLAP 새 기능 안내

http://www.gemini5201314.net/tag/awm
2009 년 3 월 5 일
댓 글 1 개
Oacle 11g 은 데이터 창고 에 도 새로운 기능 이 많 습 니 다. 특히 새로운 다 차원 데이터 세트 조직의 cube (즉, 흔히 말 하 는 MOLAP).
본 고 를 시작 하기 전에 otn 에서 Oacle 11g 의 새로운 기능 을 소개 하 는 data warehouse 부분 을 살 펴 보 는 것 을 권장 합 니 다. Oacle ace 총감독 Arup Nanda 가 쓴 것 입 니 다. 현재 otn 의 중국어 사이트 에는 번역 판 이 있 습 니 다. 주 소 는 다음 과 같 습 니 다.
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/11g-dw-olap.html?_template=/ocom/print
이 글 은 주로 위의 이 글 중의 일부 실험 과 덮어 쓰 지 않 은 부분 을 소개 한다.
 
데이터 가 져 오기
먼저http://www.oracle.com/technology/products/bi/olap/doc_sample_schemas/global_11g_schema.zip
예제 데 이 터 를 다운로드 한 후 DBA 권한 을 가 진 사용 자 를 사용 하여 global 사용 자 를 만 듭 니 다. 사용자 이름 은 global (스 크 립 트 를 수정 하지 않 는 한) 이 어야 합 니 다.
8665fb959e4f46e9d701dc587fea8b93000
시스템 의 비밀번호 와 글로벌 사용자 의 비밀 번 호 를 입력 하 라 고 요구 할 것 입 니 다.
그 후에 global schema 를 가 져 옵 니 다. 모두 8 개의 표 입 니 다. 기본적으로 성공 하고 경고 가 없 을 것 입 니 다.
두 번 째 스 크 립 트 를 실행 하지 마 세 요 global11g_create_cubes. sql, 비록 global11g_readme. html 설명 에서 두 번 째 스 크 립 트 를 실행 하 겠 다 고 했 지만 이 스 크 립 트 에 문제 가 있 으 면 실패 합 니 다. 실행 해도 괜 찮 습 니 다.
 
AWM 사용 하기
Oacle 11g 이 발표 한 AWM (Analysis Workspace Manager) 도구 와 함께 버 전 은 11.1.0.7 입 니 다.  이것 은 JAVA 도구 입 니 다. JDK 5.0 이상 이 필요 합 니 다. 아래 주소 로 다운로드 할 수 있 습 니 다.
http://www.oracle.com/technology/global/cn/products/bi/olap/index.html
Oacle 11g 은 OLAP 와 관련 된 대상 을 관리 하기 위해 분석 작업 영역 (aw) 을 도입 하 였 으 며, awm 는 aw 를 관리 하 는 도형 화 된 도구 입 니 다.
awm 압축 해제 후 명령 행 에서 실행
java –jar awm11.1.0.7.0B.jar
awm 시작 후 클릭 File – > Connect Database, 연결 할 데이터베이스 로 Global 을 선택 하고 방금 입력 한 global 사용자 이름과 비밀 번 호 를 입력 하 십시오. 그리고 분석 작업 영역 을 열 면 global 작업 분석 영역 아래 dimensions, cubes 폴 더 가 있 습 니 다. 누 르 면 비어 있 을 것 입 니 다.(otn 의 예제 에는 위의 두 번 째 스 크 립 트 가 실 행 됐 지만 다운로드 한 파일 에 문제 가 있어 실행 되 지 않 았 기 때문에 비어 있 을 것 입 니 다).
이제 dimension 과 cube 의 정 의 를 가 져 올 수 있 습 니 다. Dimension 폴 더 를 오른쪽 클릭 하여 템 플 릿 에서 만 들 기 를 선택 한 다음 CHANNEL, CUSTOMER, PRDUCT, TIME dimension 을 부 을 수 있 습 니 다. 파일 은 global schema 폴 더 아래 templates 에 있 고 cube 에 도 같은 동작 을 수행 하여 PRICE CUBE 와 UNIT CUBE 를 가 져 올 수 있 습 니 다.
 
큐 브 데이터 채 우기
위의 작업 을 마 친 후, 당신 은 4 개의 dimension 과 2 개의 cube 가 있 을 것 입 니 다. 그러나 안에 데이터 가 없습니다. 당신 은 두 가지 방법 으로 table 에서 데 이 터 를 가 져 올 수 있 습 니 다.
1. pl/sql 로  , sqlplus 에 exec dbms cube. build ('PRICE CUBE') 를 사용 합 니 다.
2. awm 를 사용 할 지, awm 의 cube 폴 더 아래 의 PRICE CUBE 에서 오른쪽 단 추 를 누 르 고, 큐 브 를 선택 합 니 다.
    awm 는 유지 보수 의 cube 와 dimension 을 선택 하고 Next 를 클릭 한 후 즉시 실행 을 선택 합 니 다. 실행 중인 것 이 무엇 인지 보고 싶 으 면 파일 저장 을 선택 할 수 있 습 니 다.
그리고 Build log 대화 상자 에서 Output 열 을 볼 수 있 습 니 다.
<CommandOutput>
<CubeLoad
Name="MAP1"
SQL="SELECT /*+  bypass_recursive_check  cursor_sharing_exact  no_expand */
  T16_MONTH_ID ALIAS_114,
  T13_ITEM_ID ALIAS_115,
  SUM(T19_UNIT_PRICE)  ALIAS_116,
  SUM(T19_UNIT_COST)  ALIAS_117
FROM
  (
  SELECT
    T1.ITEM_ID T19_ITEM_ID,
    T1.MONTH_ID T19_MONTH_ID,
    T1.UNIT_PRICE T19_UNIT_PRICE,
    T1.UNIT_COST T19_UNIT_COST
  FROM
    GLOBAL.PRICE_FACT T1   )
  T19,
  (
  SELECT
    T1.MONTH_ID T16_MONTH_ID
  FROM
    GLOBAL.TIME_DIM T1   )
  T16,
  (
  SELECT
    T1.ITEM_ID T13_ITEM_ID
  FROM
    GLOBAL.PRODUCT_DIM T1   )
  T13
WHERE
  ((T16_MONTH_ID = T19_MONTH_ID)
    AND (T13_ITEM_ID = T19_ITEM_ID)
    AND (T16_MONTH_ID = T19_MONTH_ID)
    AND (T13_ITEM_ID = T19_ITEM_ID) )
GROUP BY
  (T13_ITEM_ID, T16_MONTH_ID)
ORDER BY
  T13_ITEM_ID ASC NULLS LAST ,
  T16_MONTH_ID ASC NULLS LAST "
LOADED="2523"
REJECTED="0"
</CommandOutput>

완성 하면 cube 안의 데 이 터 를 볼 수 있 습 니 다.
 
데이터 보기
Oracle 11g 은 새로운 함수 cube table 을 도입 하여 sql 문법 을 사용 하면 MOLAP 의 데 이 터 를 볼 수 있 습 니 다. 문법 은 다음 과 같 습 니 다.
cube 문법: select * from table(cube_table(‘.’))
예제 PRICE CUBE: select * from table(cube_table(‘GLOBAL.PRICE_CUBE’))  (글로벌 로그 인 이 라면 앞의 글로벌 을 추가 하지 않 아 도 됩 니 다.)
dimension 문법: select * from table(cube_table(‘.;’))
그 중에서 hierarchy 부분 은 선택 할 수 있 습 니 다. 예 를 들 어 global 사용자 의 produt dimension:
select * from table(cube_table(‘global.product’));
dimension 에 hierarchy 가 하나 밖 에 없다 면 Oacle 은 당연히 이것 을 선택 할 것 입 니 다. dimension 에 두 개 이상 의 hierarchy 가 있다 면 Oacle 은 지정 한 기본 값 을 사용 합 니 다. time dimension 은 CALENDAR 과 FISCAL 두 개의 hierarchy 가 있 습 니 다. calendar 는 기본 값 입 니 다. 그래서 time dimension 을 조회 할 때 hierarchy 를 지정 하지 않 았 습 니 다. 실제 검색 한 ca 입 니 다.lendar hierarchy.
모든 cube 와 dimension 에 대해 Oacle 은 해당 하 는 view 를 만 들 기 때문에 cube 와 dimension 을 조회 할 때 도 해당 하 는 view 를 조회 합 니 다.
예 를 들 어 global schema 는 기본적으로 다음 view 를 만 듭 니 다 (cube 를 만 들 때): product view, product parmary view, time view, time calendar view, time fiscal view, price cube view.
모든 dimension 은 기본적으로 < dimension name > view 와 < dimension name > < hierarchy name > view 를 만 들 고, cube 는 < cube name > cube view 에 대응 합 니 다.
그 러 니까 select 실행 * from table (cube table (xxx);
예 를 들 어 price cube view 의 정 의 는 다음 과 같다.
8665fb959e4f46e9d701dc587fea8b93001
 
cube 필터, 정렬, 집합
좀 더 복잡 한 sql:
SELECT * FROM TABLE(CUBE_TABLE(   ‘global.price_cube HIERARCHY product primary HIERARCHY time calendar’))
   where TIME=’TOTAL_TOTAL’
   ORDER BY PRODUCT      ;
 
SELECT SUM(UNIT_COST),SUM(UNIT_PRICE),PRODUCT  FROM TABLE(CUBE_TABLE(   ‘global.price_cube HIERARCHY product primary HIERARCHY time calendar’))
   where TIME=’TOTAL_TOTAL’      GROUP BY PRODUCT
   ORDER BY PRODUCT      ;
 
일반적인 sql 기본 과 마찬가지 로 cube table 의 쓰기 방법 을 제외 하고 주의해 야 합 니 다. GUI 인터페이스 를 통 해 보 는 것 을 좋아한다 면 awm 에서 오른쪽 단 추 를 누 르 면 cube 를 선택 하여 데 이 터 를 볼 수 있 습 니 다.  차원 을 클릭 하여 펼 칠 수도 있 고 아래 에 도표 도 있 습 니 다.
검색 구축 기 에서 (위의 그림 에서 파일 메뉴 의 아래 버튼) 복잡 한 구축 도 선택 할 수 있 습 니 다.
이 화면 은 오히려 owb 안의 것 과 완전히 같 아서 같은 코드 를 사용 할 것 으로 추정 된다
가장 원시 적 인 모델 은 essbase 에서 참고 한 것 이 고 인터페이스 구조 와 조작 방식 은 모두 essbase 와 매우 비슷 하 다.
 
 
cube 관리 방법
cube 를 삭제 하거나 수정 할 수 있 는 직접적인 pl/sql 이 없습니다. 현재 dbms cube 패키지 에는 세 개의 함수 build (), import xml, vaidate xml () 이 있 습 니 다.  build () 는 데 이 터 를 채 우 는 데 사 용 됩 니 다. cube 의 정의 가 마음 에 들 지 않 으 면 수정 하거나 삭제 하려 면 보통 awm 를 통 해  otn 위 에 제 시 된 global schema 파일 에는 삭제 한 예 가 있 습 니 다. 수 동 으로 xml 를 연결 한 다음 dbms cube. import (xml).
  set serverout on

  declare      xmlCLOB   clob;      v_i       number;      type t_dims is table of all_cube_dimensions%rowtype;      type t_cubes is table of all_cubes%rowtype;      v_dims    t_dims;      v_cubes   t_cubes;      v_cmd     varchar2(400);    

  begin      -- Check if the AW exists
    dbms_output.put_line('... checking for GLOBAL AW in GLOBAL schema');     SELECT COUNT(*)      INTO v_i     FROM all_aws     WHERE owner = 'GLOBAL'      AND aw_name = 'GLOBAL';


    -- Delete the AW if it exists     if v_i > 0 then       dbms_output.put_line('... deleting GLOBAL AW in GLOBAL schema');        dbms_lob.createtemporary(xmlCLOB,TRUE);        dbms_lob.open(xmlCLOB, DBMS_LOB.LOB_READWRITE);        dbms_lob.writeappend(xmlCLOB, 9, '<Metadata');        dbms_lob.writeappend(xmlCLOB, 16, '  Version="1.1">');        dbms_lob.writeappend(xmlCLOB, 5, '  <AW');        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');        dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');        dbms_lob.writeappend(xmlCLOB, 19, '    Name="GLOBAL"/>');        -- Loop over each of the Dimensions in the AW and delete them        select *  bulk collect  into v_dims   from all_cube_dimensions        where owner = 'GLOBAL'  and aw_name = 'GLOBAL';
        for i in 1 .. v_dims.count loop          v_cmd := '<' || initcap(v_dims(i).dimension_type) || 'Dimension';          dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');        dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');         v_cmd := '    Name="' || v_dims(i).dimension_name || '"/>';         dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);              end loop; 

     -- Loop over each of the cubes and delete them
        select * bulk collect into v_cubes         from all_cubes        where owner = 'GLOBAL'          and aw_name = 'GLOBAL';        for i in 1 .. v_cubes.count loop          dbms_lob.writeappend(xmlCLOB, 7, '  <Cube');        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');          dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');         v_cmd := '    Name="' || v_cubes(i).cube_name || '"/>';                      dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);       end loop;            -- Finish off the removal tags
        dbms_lob.writeappend(xmlCLOB, 11, '</Metadata>');            dbms_lob.close(xmlCLOB);            dbms_output.put_line(xmlCLOB);       --  dbms_cube.import_xml(xmlCLOB);       commit;     else       dbms_output.put_line('... GLOBAL AW in GLOBAL schema not found');     end if;     exception       when others then         dbms_output.put_line(' ');         dbms_output.put_line('# ERROR:  Installation failed.');         dbms_output.put_line('# Please ensure that the analytic workspace GLOBAL is not currently open.');         raise_application_error(-20000, 'Can not delete analytic workspace that is currently in use.');
end;
/

dbms cube. import xml () 줄 의 주석 을 지 웠 습 니 다. 출력 은 다음 과 같 습 니 다.
<Metadata  Version="1.1">  <AW    Action="REMOVE"    Owner="GLOBAL"  Name="GLOBAL"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="CHANNEL"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="CUSTOMER"/><TimeDimension    Action="REMOVE"    Owner="GLOBAL"  Name="TIME"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="PRODUCT"/>  <Cube    Action="REMOVE"    Owner="GLOBAL"  Name="PRICE_CUBE"/></Metadata>

삭제 작업 을 수행 하 는 것 이 Action = "REMOVE"를 통 해 이 루어 지 는 것 을 볼 수 있 습 니 다.
 
마지막.
cube 의 데이터 저장 및 새로 고침 에 관 한 소개, 그리고 Oacle 11g 의 OLAP 새로운 기능 도 있 습 니 다. 검색 재 작성 을 더 자주 실행 합 니 다.  ,
파 티 션 의 오래된 정도 검사  otn 에 소개 가 있 으 니 가 보 셔 도 됩 니 다.
 
참고 자료
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/11g-dw-olap.html?_template=/ocom/print
otn 에 Oacle 11g olap 의 새로운 기능 을 소개 하 는 글 입 니 다.
 
http://www.oracle.com/technology/products/bi/olap/collateral/OLAP_11g_MV_query_rewrite.html?_template=/ocom/print
cube 뮤 직 비디오 의 리 셋 방식 을 소개 하 는 글
 
http://www.dba-oracle.com/t_olap_dimensions_cubes.htm
11g 이전 olap 개념 을 소개 하 는 글 은 Oacle ace 입 니 다. Mark Rittman pl/sql 에서 cube 를 만 들 고 유지 하 는 방법 에 대한 코드 가 있 습 니 다 (awm 작업 은 더 간단 합 니 다)

좋은 웹페이지 즐겨찾기