행위

"인덱스 생성 추출 함수인덱스"의 두 판 사이의 차이

DB CAFE

(새 문서: == 함수 인덱스가 포함 된 인덱스 추출 생성 == # “컬럼 desc” 생성시 Function-Based Index 로 됨 # 함수형 인덱스 정보는 all_ind_expressions 뷰 column_...)
 
 
(같은 사용자의 중간 판 4개는 보이지 않습니다)
11번째 줄: 11번째 줄:
  
 
<source lang=sql>
 
<source lang=sql>
select *
+
SELECT *
  from xmltable(
+
FROM XMLTABLE(
          '/ROWSET/ROW'
+
        '/ROWSET/ROW'
          passing (select dbms_xmlgen.getxmltype('select * from all_ind_expressions
+
        PASSING (SELECT DBMS_XMLGEN.GETXMLTYPE('SELECT * FROM ALL_IND_EXPRESSIONS
                                                  where index_name = ''XDB$COMPLEX_TYPE_AK''')
+
                                                WHERE INDEX_NAME = ''XDB$COMPLEX_TYPE_AK''')
                    from dual)
+
                  FROM DUAL)
          columns index_owner varchar2(30) path 'INDEX_OWNER',
+
        COLUMNS INDEX_OWNER VARCHAR2(30) PATH 'INDEX_OWNER'
                  index_name varchar2(30) path 'INDEX_NAME',
+
              , INDEX_NAME VARCHAR2(30) PATH 'INDEX_NAME'
                  table_owner varchar2(30) path 'TABLE_OWNER',
+
              , TABLE_OWNER VARCHAR2(30) PATH 'TABLE_OWNER'
                  table_name varchar2(30) path 'TABLE_NAME',
+
              , TABLE_NAME VARCHAR2(30) PATH 'TABLE_NAME'
                  column_expression varchar2(4000) path 'COLUMN_EXPRESSION')
+
              , COLUMN_EXPRESSION VARCHAR2(4000) PATH 'COLUMN_EXPRESSION'
 +
              , COLUMN_POSITION NUMBER PATH 'COLUMN_POSITION'
 +
              )
  
 
</source>
 
</source>
  
=== 함수형 안덱스가 포함됨 전체 인덱스 컬럼 추출 ===
+
=== 함수형 인덱스가 포함됨 전체 인덱스 컬럼 추출 ===
 
* 컬럼 desc 생성시 Function-Based Index 로 됨
 
* 컬럼 desc 생성시 Function-Based Index 로 됨
 
* 아래 예제는 컬럼에 desc 로 생성한 인덱스 조회 예시임.  
 
* 아래 예제는 컬럼에 desc 로 생성한 인덱스 조회 예시임.  
 
<source lang=sql>
 
<source lang=sql>
 +
WITH FNC_IND_COLS AS (
 +
                      SELECT *
 +
                        FROM XMLTABLE(
 +
                                '/ROWSET/ROW'
 +
                                PASSING (SELECT DBMS_XMLGEN.GETXMLTYPE('SELECT * FROM ALL_IND_EXPRESSIONS
 +
                                                                        WHERE INDEX_NAME = ''XDB$COMPLEX_TYPE_AK''')
 +
                                          FROM DUAL)
 +
                                COLUMNS INDEX_OWNER VARCHAR2(30) PATH 'INDEX_OWNER'
 +
                                      , INDEX_NAME VARCHAR2(30) PATH 'INDEX_NAME'
 +
                                      , TABLE_OWNER VARCHAR2(30) PATH 'TABLE_OWNER'
 +
                                      , TABLE_NAME VARCHAR2(30) PATH 'TABLE_NAME'
 +
                                      , COLUMN_EXPRESSION VARCHAR2(4000) PATH 'COLUMN_EXPRESSION'
 +
                                      , COLUMN_POSITION NUMBER PATH 'COLUMN_POSITION'
 +
                                      )
 +
                    )
  
with FNC_IND_COLS as (
+
SELECT A.OWNER , A.TABLE_NAME , A.INDEX_NAME
select *
+
    , ( SELECT LISTAGG(COLUMN_NAME,' , ')  WITHIN GROUP(ORDER BY COLUMN_POSITION)
  from xmltable(
+
          FROM (
          '/ROWSET/ROW'
+
                SELECT A.INDEX_NAME
          passing (select dbms_xmlgen.getxmltype('select * from all_ind_expressions
+
                      , A.INDEX_OWNER
                                                  where index_name = ''XDB$COMPLEX_TYPE_AK''')
+
                      , CASE A.DESCEND WHEN 'DESC' THEN B.COLUMN_EXPRESSION || ' DESC'
                    from dual)
+
                        ELSE A.COLUMN_NAME
          columns index_owner varchar2(30) path 'INDEX_OWNER',                  index_name varchar2(30) path 'INDEX_NAME',                  table_owner varchar2(30) path 'TABLE_OWNER',                  table_name varchar2(30) path 'TABLE_NAME',                 column_expression varchar2(4000) path 'COLUMN_EXPRESSION'
+
                  FROM DBA_IND_COLUMNS A
,column_position number path 'COLUMN_POSITION' )
+
                      , FNC_IND_COLS B
)
+
                  WHERE REGEXP_LIKE(A.INDEX_OWNER,'EEDADM|CICADM')
 +
                  AND A.INDEX_OWNER = B.INDEX_OWNER(+)
 +
                  AND A.INDEX_NAME  = B.INDEX_NAME(+)
 +
                  AND A.TABLE_OWNER = B.TABLE_OWNER(+)
 +
                  AND A.TABLE_NAME  = B.TABLE_NAME(+)
 +
                  AND A.COLUMN_POSION = B.COLUMN_POSITION(+)
 +
                ) S
 +
          WHERE S.INDEX_NAME = A.INDEX_NAME
 +
            AND S.INDEX_OWNER = A.OWNER
 +
          GROUP BY INDEX_OWNER,INDEX_NAME
 +
      ) COLS
 +
  FROM DBA_INDEXES A
 +
WHERE REGEXP_LIKE(A.OWNER,'DBCAFE')
 +
  AND NOT REGEXP_LIKE(INDEX_NAME,'^SYS\_')
 +
ORDER BY TABLE_NAME
 +
) A
  
select a.owner,a.table_name,a.index_name
 
    , ( select listagg(column_name,' , ')  within group(order by column_position)
 
          from (
 
                select a.index_name , a.index_owner, case a.descend when 'DESC' then b.column_expression || ' DESC'
 
else a.column_name
 
  from dba_ind_columns a
 
    , FNC_IND_COLS b
 
where regexp_like(a.index_owner,'EEDADM|CICADM')
 
  and a.index_owner = b.index_owner(+)
 
  and a.index_name  = b.index_name(+)
 
  and a.table_owner = b.table_owner(+)
 
  and a.table_name  = b.table_name(+)
 
  and a.column_posion = b.column_position(+)
 
  ) s
 
where s.index_name = a.index_name
 
  and s.index_owner = a.owner
 
group by index_owner,index_name
 
) cols
 
  from dba_indexes a
 
where regexp_like(a.owner,'DBCAFE')
 
  and not regexp_like(index_name,'^SYS\_')
 
order by table_name
 
) a 
 
 
</source>
 
</source>
 +
[[category:oracle]]

2024년 1월 2일 (화) 00:13 기준 최신판

thumb_up 추천메뉴 바로가기


1 함수 인덱스가 포함 된 인덱스 추출 생성[편집]

  1. “컬럼 desc” 생성시 Function-Based Index 로 됨
  2. 함수형 인덱스 정보는 all_ind_expressions 뷰 column_expression 컬럼 참조
    1. 문제는 column_expression 컬럼 타입이 Long 형임
    2. 오라클에서 Long => varchar 로 변경하는 뽀족한 수가 없음
    3. 그래서 오라클 xmltable 이용하여 문자형으로 추출함 (아래 sql 참조)

1.1 함수형 인덱스 조회[편집]

  • all_ind_expressions
  • dba_ind_expressions
SELECT *
FROM XMLTABLE(
        '/ROWSET/ROW'
        PASSING (SELECT DBMS_XMLGEN.GETXMLTYPE('SELECT * FROM ALL_IND_EXPRESSIONS
                                                 WHERE INDEX_NAME = ''XDB$COMPLEX_TYPE_AK''')
                   FROM DUAL)
        COLUMNS INDEX_OWNER VARCHAR2(30) PATH 'INDEX_OWNER'
              , INDEX_NAME VARCHAR2(30) PATH 'INDEX_NAME'
              , TABLE_OWNER VARCHAR2(30) PATH 'TABLE_OWNER'
              , TABLE_NAME VARCHAR2(30) PATH 'TABLE_NAME'
              , COLUMN_EXPRESSION VARCHAR2(4000) PATH 'COLUMN_EXPRESSION'
              , COLUMN_POSITION NUMBER PATH 'COLUMN_POSITION' 
              )

1.2 함수형 인덱스가 포함됨 전체 인덱스 컬럼 추출[편집]

  • 컬럼 desc 생성시 Function-Based Index 로 됨
  • 아래 예제는 컬럼에 desc 로 생성한 인덱스 조회 예시임.
WITH FNC_IND_COLS AS (
                      SELECT *
                        FROM XMLTABLE(
                                '/ROWSET/ROW'
                                PASSING (SELECT DBMS_XMLGEN.GETXMLTYPE('SELECT * FROM ALL_IND_EXPRESSIONS
                                                                         WHERE INDEX_NAME = ''XDB$COMPLEX_TYPE_AK''')
                                           FROM DUAL)
                                COLUMNS INDEX_OWNER VARCHAR2(30) PATH 'INDEX_OWNER'
                                      , INDEX_NAME VARCHAR2(30) PATH 'INDEX_NAME'
                                      , TABLE_OWNER VARCHAR2(30) PATH 'TABLE_OWNER'
                                      , TABLE_NAME VARCHAR2(30) PATH 'TABLE_NAME'
                                      , COLUMN_EXPRESSION VARCHAR2(4000) PATH 'COLUMN_EXPRESSION'
                                      , COLUMN_POSITION NUMBER PATH 'COLUMN_POSITION' 
                                      )
                    )

SELECT A.OWNER , A.TABLE_NAME , A.INDEX_NAME
     , ( SELECT LISTAGG(COLUMN_NAME,' , ')  WITHIN GROUP(ORDER BY COLUMN_POSITION)
           FROM (
                 SELECT A.INDEX_NAME 
                      , A.INDEX_OWNER
                      , CASE A.DESCEND WHEN 'DESC' THEN B.COLUMN_EXPRESSION || ' DESC'
                        ELSE A.COLUMN_NAME
                   FROM DBA_IND_COLUMNS A
                      , FNC_IND_COLS B
                  WHERE REGEXP_LIKE(A.INDEX_OWNER,'EEDADM|CICADM')
                   AND A.INDEX_OWNER = B.INDEX_OWNER(+)
                   AND A.INDEX_NAME  = B.INDEX_NAME(+)
                   AND A.TABLE_OWNER = B.TABLE_OWNER(+)
                   AND A.TABLE_NAME  = B.TABLE_NAME(+)
                   AND A.COLUMN_POSION = B.COLUMN_POSITION(+)
                ) S
          WHERE S.INDEX_NAME = A.INDEX_NAME
            AND S.INDEX_OWNER = A.OWNER
          GROUP BY INDEX_OWNER,INDEX_NAME
       ) COLS
  FROM DBA_INDEXES A
 WHERE REGEXP_LIKE(A.OWNER,'DBCAFE')
   AND NOT REGEXP_LIKE(INDEX_NAME,'^SYS\_')
 ORDER BY TABLE_NAME
) A