태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Extended Describe

오라클 2009.10.01 12:30
Describe 명령은 Table의 정의를 볼 때 많이 사용합니다. 개인적으로는 Describe를 튜닝 툴의 범주에 넣습니다. 성능 문제를 다루다보면 오브젝트의 명확한 정의를 알아야할 때가 많기 때문입니다.

SQL*Plus의 Describe의 결과에 1) DDL 문장 자체, 2) 인덱스 구성, 3) 인덱스 정의 DDL을 같이 봐야할 경우가 많습니다. 저는 이런 기능이 추가된 Describe 명령을 Extended Describe라고 부릅니다.

간단한 예를 통해서 볼까요. 다음과 같이 8개의 인덱스를 가진 테이블 T1을 만듭니다.

create table t1(c1 int, c2 int, c3 int, c4 int, c5 int);

create index t1_n1 on t1(c1);
create unique index t1_n2 on t1(c1, c3);
create index t1_n3 on t1(c1, c4);
create index t1_n4 on t1(c1, c5);
create index t1_n5 on t1(c3, c4);
create index t1_n6 on t1(c3, c4, c5);
create index t1_n7 on t1(c4, c5);
create unique index t1_n8 on t1(c5, c1);

@desc ukja t1
다음과 같이 Extended Describe(desc.sql) 명령을 이용해서 테이블 정의를 볼까요?
UKJA@ukja1021> @desc ukja t1
UKJA@ukja1021> set echo off

OBJECT_TYPE
-------------------
TABLE

Elapsed: 00:00:00.01
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      C1                                       NUMBER(38)
    2      C2                                       NUMBER(38)
    3      C3                                       NUMBER(38)
    4      C4                                       NUMBER(38)
    5      C5                                       NUMBER(38)

Index               1...3...4...5...
T1_N1...............1
T1_N2...............1U  2U
T1_N3...............1       2
T1_N4...............1           2
T1_N5...............    1   2
T1_N6...............    1   2   3
T1_N7...............        1   2
T1_N8...............2U          1U

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.14

DDL
--------------------------------------------------------------------------------

  CREATE TABLE "UKJA"."T1"
   (	"C1" NUMBER(*,0),
	"C2" NUMBER(*,0),
	"C3" NUMBER(*,0),
	"C4" NUMBER(*,0),
	"C5" NUMBER(*,0)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"



Elapsed: 00:00:00.45

DDL
--------------------------------------------------------------------------------

  CREATE INDEX "UKJA"."T1_N1" ON "UKJA"."T1" ("C1")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE UNIQUE INDEX "UKJA"."T1_N2" ON "UKJA"."T1" ("C1", "C3")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE INDEX "UKJA"."T1_N3" ON "UKJA"."T1" ("C1", "C4")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE INDEX "UKJA"."T1_N4" ON "UKJA"."T1" ("C1", "C5")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE INDEX "UKJA"."T1_N5" ON "UKJA"."T1" ("C3", "C4")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE INDEX "UKJA"."T1_N6" ON "UKJA"."T1" ("C3", "C4", "C5")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE INDEX "UKJA"."T1_N7" ON "UKJA"."T1" ("C4", "C5")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

  CREATE UNIQUE INDEX "UKJA"."T1_N8" ON "UKJA"."T1" ("C5", "C1")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 10485760 NEXT 10485760 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "UKJA_TBS"

8 rows selected.

Elapsed: 00:00:01.28
desc.sql 파일은 여기에 있습니다.

요점은 오브젝트의 정의를 정확하게 아는 것이 정말 중요하다는 것입니다.

저작자 표시
신고

'오라클' 카테고리의 다른 글

샘플링 vs. 이벤트  (0) 2009.10.06
오라클 가계부 쓰고 있습니까?  (0) 2009.10.05
Extended Describe  (6) 2009.10.01
Fixed Table에 대한 Query 튜닝하기  (0) 2009.09.29
Parallel Query와 direct path read, 그리고 LOB  (1) 2009.09.24
tags :
Trackback 0 : Comments 6
  1. 정철우 2009.10.01 15:31 신고 Modify/Delete Reply

    아.. 이거 너무 좋네요. 감사합니다.^^:

  2. adenkang 2009.10.01 20:16 신고 Modify/Delete Reply

    정말 유용하게 사용될 것 같습니다.

  3. 이명진 2009.10.13 16:29 신고 Modify/Delete Reply

    정말 유용한 것 같습니다. 감사합니다^^
    참고로 위의 스크립트 링크 주소가 약간 다른 것 같습니다.

    desc script 주소 : http://sites.google.com/site/ukja/sql-scripts-1/c/desc-1

  4. 김병규 2009.10.14 15:24 신고 Modify/Delete Reply

    차장님 안녕하세요. 포스팅을 보던 중 전에 레포트 관련 쿼리를 만들다가 xquery를 이용해서 해결하였던 것이 생각났습니다. 응용하여 인덱스 정보를 가져오는 쿼리를 만들어 보았습니다.

    쿼리는 다음과 같습니다.

    SELECT IC.INDEX_NAME , ID.UNIQUENESS , IC.COL_LIST as COL_LIST
    FROM DBA_INDEXES ID , (
    SELECT INDEX_NAME , REGEXP_REPLACE( REPLACE(XMLAGG(XMLELEMENT("COL", COLUMN_NAME )) , '</COL><COL>', '+'), '<COL>(.+)</COL>' , '\1') AS COL_LIST
    FROM (
    SELECT INDEX_NAME, COLUMN_NAME
    FROM DBA_IND_COLUMNS
    WHERE TABLE_OWNER = upper('&__SCH_NAME')
    AND TABLE_NAME = upper('&__OBJ_NAME')
    ORDER BY INDEX_NAME,COLUMN_POSITION )
    GROUP BY INDEX_NAME
    ) IC
    WHERE ID.TABLE_OWNER = upper('&__SCH_NAME')
    AND ID.TABLE_NAME = upper('&__OBJ_NAME')
    AND ID.INDEX_NAME = IC.INDEX_NAME ;

  5. 이이구 2009.10.15 10:22 신고 Modify/Delete Reply

    유용할 것 같네요. ^^;

    괜찮으시다면 몇가지 기능만 추가해주신다면 더욱더 좋을것같아 의견드려요.
    (너무 확장이 되는게 아닌지 모르겠네요)

    1. 스토리지절 표시를 파라미터로 선택할 수 있도록 수정

    EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
    EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE);
    EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);

    2. COMMENT 절 추가

    3. 인덱스가 없거나, 인덱스 하나 있을때 이쁘게 표시될 수 있도록

    4. 해당 테이블 관련 dependancy 도 같이 보일수 있도록... ^^;

Write a comment

티스토리 툴바