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

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

関連記事

C#で発生するORA-01036:illegal variable name/numberのエラーの解決法

毎度毎度、原因の分かりづらいエラーにハマりますw 今回は、「ORA-01036:illegal variable name/number」。 日本語に直訳された内容だと「変数の名前/数が無効です」とな …

Oracle11gでパスワードの有効期限を変更する

先日のOra-28001ですが、他のユーザーも同様になってましたw 当然ですね・・・ 日本の中心付近で仕様変更と闘うSE日記Oracleで「Ora-28001:the password has exp …

Oracleで「ORA-00918: 列の定義が不明瞭です 」のエラーの解決法と発生理由

発生したエラー ORA-00918: 列の定義が不明瞭です 原因 原因は、同じ列名やテーブルの別名を使用していること。 解決方法 Select句で羅列している列に同一の列名(別テーブル)があれば、as …

[ORACLE]ORA-12514:TNS 指定された接続識別子を解決できませんでした のエラー対処法

ORA-12514 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor …

ORACLEでDELETEとTRUNCATEのどちらを使うか。

未だに迷う。 例えば、テーブル全件削除をしたいときは delete * from tableA; delete文なら、こうだし。 truncate tableA; truncate文なら、こう。


カテゴリー