ORACLEでSPOOL処理の高速化を考えてみた
事の発端は、お客様のお怒りでした・・・
なんで、お客さんに最新版のリリース時には、必ずスキーマ間の比較をすることを徹底しろと言われてしまったと。
まぁ、詳細は後述するとして、少なくともテーブル一覧とテーブルの項目とデータ型のチェックだけはしないといけない。
どうしようね?って話になったので、まずは普段使用しているA5Mk2っていうソフトに「スキーマの比較」っていう機能があるので使ってみた。
テーブルやビューが200個超えなのもあって、時間がかかるかかる・・・(☝︎ ՞ਊ ՞)☝︎
やってらんね・・・
これだと、お客さんに提示するために、余計に1日かかってしまう・・・ってことで、何とかしようということに。
こんなSQLで書きました。
set echo off;
set linesize 1000;
set pagesize 0;
set trimspool on;
set feedback off;
set heading off;
set colsep ‘,’;
spool &1
--全テーブル・カラムの出力(整形済み)
select
col.table_name -- テーブル名(論理名)
, tab_c.comments -- テーブル名(物理名)
, col.column_name -- 列名(論理名)
, col_c.comments -- 列名(物理名)
, col.data_type
, col.data_length
, col.data_precision
, col.data_scale
, col.data_default
FROM user_tab_columns col
inner join user_tab_comments tab_c
on col.table_name = tab_c.table_name
inner join user_col_comments col_c
on col.table_name = col_c.table_name
and col.column_name = col_c.column_name
order by
col.table_name,
col.column_name
;
spool off;
exit;
ただ、このSQLだと、バッチで実行するときに1〜2分かかってしまった。
多分、実行環境のテーブル数のせいもあるんだろうけど、一緒にわちゃわちゃ騒いでた派遣さんと盛り上がって、「こっちで実行するだけだし、1〜2分なら十分じゃね?」から、「もっと早く実行できるように!」ってw
結局、データ型の変更は、一大事なので、発生頻度は低い・・・ということにして、テーブルとカラムの一覧で比較するということに。
最終的には、バッチファイルで2つのスキーマの出力を行い、コマンドプロンプトのcompコマンドで出力ログの比較を行うっていうところで落ち着きましたw
SPOOL出力の高速化の際に参考にしたのは、こちら。
SQL*Plus使い方 – SPOOL処理の高速化(シェルスク リプトTips-5)
https://blogs.oracle.com/oracle4engineer/entry/sqlplus_-_spool_tips-5
そもそも、なんでこんなことになったかというと・・・
開発環境のせいで管理しなきゃいけないスキーマが増えていくわけです・・・
するとどうなるか?
定義の適用漏れが出てくるw
分かっちゃいるんですが、テスト用・開発用・本番前のテスト用等々・・・
使うスキーマは増えこそすれ、減ることは無いわけです。
そりゃ、たまにサーバーの容量圧迫のせいで減らすことを余儀なくはされるけど、基本、作ったらその開発が終わるまではそのまま。
下手すりゃ、サポート期間に入ったら、そのまま残る。
で、冒頭になるけど、そうなると、テーブルの項目追加などが発生したときに、開発・テスト用までは適用が済んでても、本番前テスト用のスキーマで未適用で、エラーになることもある。
まぁ、そこでエラーになって、「未適用だったねwww」で終われば別に問題は無い。
問題は、お客様環境に最新版のexeを展開してから、エラーが発生した場合・・・
そりゃぁ、平謝りですよ。
だって、客からしたら、「なんでエラー発生してんの?」って感じなので。
で、調べると、DBへの適用漏れだったりすることがある・・・と。
DBの定義変更とかテーブル追加なんて、割と大きな変更なはずなのに、開発の状況によっては、客先環境への適用が完全にすっぽ抜ける事があるんです・・・
いや、本当マジで・・・