背景と状況
本番用データベースとテスト用データベースとでテーブルのインデックスが異なっていることはありませんか。インデックスが定義されていない、列の並びが違う、列が不足している等です。テーブルが300くらいあると調べるのが大変です。
やりたいこと
異なるデータベースのインデックスを比較して違いを見つけたい。
IBM Db2 V11.5 Windwosで確認しています。
やり方
Db2のシステムテーブルからインデックス情報を取得してテキストファイルに出力、テキスト比較ツールで比較します。
- SQLを作るSQL
- インデックス情報をファイルに出力
- テキスト比較ツールで比較
SQLを作るSQL
まずはテーブルの一覧を取得してテーブルごとにインデックス情報をファイルに出力するSQLを作成します。比較対象から外すテーブルをwhere条件で指定しています。
Index_SYSCAT.sql
SELECT 'EXPORT TO '
|| Rtrim(indname)
|| '.txt of del '
||
' select INDNAME, COLNAME, COLORDER from SYSCAT.INDEXCOLUSE where INDNAME = '''
|| Rtrim(indname)
|| ''' order by COLSEQ ;'
FROM syscat.indexes
WHERE indschema = 'DB2ADMIN'
AND tabname not LIKE 'ADVISE_%'
AND tabname not LIKE 'EXPLAIN_%'
AND tabname not in ('OBJECT_METRICS')
ORDER BY tabname,
indname ;
以下のコマンドでSQLを作成します。Index_out.sqlというファイルが作成されます。
db2 -txf Index_SYSCAT.sql -z Index_out.sql
Index_out.sql
EXPORT TO MST_KEY.txt of del select INDNAME, COLNAME, COLORDER from SYSCAT.INDEXCOLUSE where INDNAME = 'MST_KEY' order by COLSEQ ;
EXPORT TO SND_KEY.txt of del select INDNAME, COLNAME, COLORDER from SYSCAT.INDEXCOLUSE where INDNAME = 'SND_KEY' order by COLSEQ ;
テーブルごとにインデックス情報をファイルにエクスポートするSQLです。
インデックス情報をファイルに出力
以下のコマンドでファイルにインデックス情報をエクスポートします。
db2 -tvf Index_out.sql
テキスト比較ツールで比較
フォルダーごとテキスト比較ツールで比較します。例では、WinMergeを使って比較しています。
ファイルをクリックして中身を表示します。
インデックスごとに列名、昇順降順を比較することになります。