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でORA-01861: リテラルが書式文字列と一致しません

ORA-01861: リテラルが書式文字列と一致しません このエラー、ぶっちゃけ、意味が分からないところでもある。 日付の指定時に発生してて、原因が判明するまでに結構回り道をしました。 ネットで検索し …

[ORACLE]指定日付の月末を取得する

LAST_DAYで月末を取得する LAST_DAYを使います。 実際、仕様で、ある項目には月末を入力させるとか、翌月1日を指定するとかいうのが指定されたりします。 細かく計算してると正直面倒くさいです …

[Oracle]長文SQLをWITH句を使って、SQLの繰り返しをまとめる

自分、WITH句アレルギーです\(^o^)/ 今でこそ、使うようになりましたが、最初は拒否反応バリバリでした。 だって、WITH句で何ができるのか良く分からなかったからです。 VIEWのように使えるか …

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

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

no image

Oracleの再受験無料キャンペーンは5月31日まで

【ピアソンVUE専用】Oracle会場試験用受験チケット(電子チケット) 価格:26,720円 (2019/5/19 14:11時点) 感想(15件) 【ピアソンVUE専用】Oracleオンライン試験 …


カテゴリー