인덱스 비교

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

인덱스 비교

개발DB와 테스트DB, 또는 테스트DB와 운영DB간 인덱스를 비교할 때는 다음 쿼리를 사용할 수 있다.

인덱스 명세

인덱스를 비교하기 위해서는 먼저 인덱스 명세를 만들어야 한다. 인덱스에 포함된 컬럼 개수의 최대값을 구한 다음 그 값만큼 max(decode(..))를 해줘서 인덱스에 대한 명세를 구할 수 있다.

-- 인덱스에 포함된 컬럼의 최대 개수 파악
select max(column_position)
from all_ind_columns
where index_owner='XXX';
-- 최대 개수만큼 max(decode(...)) 지정
select table_name, index_name,
  max(decode(column_position, 1, column_name)) ||
  max(decode(column_position, 2, '+'||column_name)) ||
  max(decode(column_position, 3, '+'||column_name)) ||
  max(decode(column_position, 4, '+'||column_name)) ||
  max(decode(column_position, 5, '+'||column_name)) ||
  max(decode(column_position, 6, '+'||column_name)) ||
  max(decode(column_position, 7, '+'||column_name)) ||
  max(decode(column_position, 8, '+'||column_name)) ||
  max(decode(column_position, 9, '+'||column_name)) ||
  max(decode(column_position,10, '+'||column_name)) index_columns
from all_ind_columns
where index_owner = 'XXX'
group by table_name, index_name;

DB간 인덱스 비교

인덱스 명세를 구할 수 있으면, 양쪽 DB에서 인덱스 명세를 구한 다음 이를 비교하면 된다.

with
a as (
  select table_name, index_name,
    max(decode(column_position, 1, column_name)) ||
    max(decode(column_position, 2, '+'||column_name)) ||
    max(decode(column_position, 3, '+'||column_name)) ||
    max(decode(column_position, 4, '+'||column_name)) ||
    max(decode(column_position, 5, '+'||column_name)) ||
    max(decode(column_position, 6, '+'||column_name)) ||
    max(decode(column_position, 7, '+'||column_name)) ||
    max(decode(column_position, 8, '+'||column_name)) index_columns
  from all_ind_columns
  where index_owner = 'XXX'
  group by table_name, index_name),
b as (
  select table_name, index_name,
    max(decode(column_position, 1, column_name)) ||
    max(decode(column_position, 2, '+'||column_name)) ||
    max(decode(column_position, 3, '+'||column_name)) ||
    max(decode(column_position, 4, '+'||column_name)) ||
    max(decode(column_position, 5, '+'||column_name)) ||
    max(decode(column_position, 6, '+'||column_name)) ||
    max(decode(column_position, 7, '+'||column_name)) ||
    max(decode(column_position, 8, '+'||column_name)) index_columns
  from all_ind_columns@testdb
  where index_owner = 'XXX'
  group by table_name, index_name)
select a.*, b.*
from a, b
where a.table_name = b.table_name
  and a.index_name = b.index_name
  and a.index_columns <> b.index_columns
;