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でLISTAGG関数を使ったけど、世界を変えられなかった話・・・

OracleでLISTAGG関数を使ったら、世界が変わった話。 はい、休日出勤でした。 そして、休日出勤の結果、以下のことが分かりました(泣 日本の中心付近で仕様変更と闘うSE日記OracleでLIS …

Oracleで「ORA-00906: 左カッコがありません。」のエラーが出た時の対処法

はい。 そろそろ、上司の無茶目な仕様変更にも折り合いをつけて行きたいSEっぽいことをやってる人です。 前にも書いたかもしれないけど、また、どハマリしたOracleのエラーについて。 エラーの内容が全て …

Oracle Database Bronzeの勉強を始めました。

業務でOracleを使ってます。 DBへの接続と簡単なSQLの確認ぐらいだったら、SQLDeveloperとかのツールを使わずにSQLPlusだけで済ませちゃう人も多いのかな? あとは、SQLのバッチ …

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

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

[ORACLE]統計更新を強制的にする

Oracleの統計情報の更新方法 頻度はそんなに無いというか、先日、トラブル対応時に必要に迫られたので・・・ 通常は、Oracleの統計情報は1日1回更新されるらしいんだけど、夜とかになるみたい。 多 …


カテゴリー