ORACLEでSPOOL処理の高速化を試す

投稿日:2017-06-05

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の定義変更とかテーブル追加なんて、割と大きな変更なはずなのに、開発の状況によっては、客先環境への適用が完全にすっぽ抜ける事があるんです・・・
いや、本当マジで・・・







-ORACLE
-,


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

[Oracle]破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。

破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。 破棄されたオブジェクトかどうかの判断(MSDK) MSDNでも破棄さ …

ORACLEで他のスキーマでSQLを実行した時に、権限不足で「ORA-01031: 権限が不足しています。」のエラーになる

A5Mk2 http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ 普段、SQL関連は、A5Mk2っていうソフトを使用しています。 今回のエラーは、自 …

SQLのJOINの種類を理解する

これは分かりやすい。 https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ INNNER JOIN FULL OUTER J …

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …

partition by を使って、ORACLEで、グループ毎に1行だけ取得する。

グループ単位で一番小さいとか、一番大きいとかだけなら、MinやMaxを使って外部結合で対応できるんだけど、1番目2番目3番目を1列で取得しなきゃいけない状態になったので、調べて解決。 「partiti …


カテゴリー