現在地

第4回 サポートツールを活用しよう(3)


今回はSQL文の分析ツール「SQLHC(SQL Health Check)」を紹介します。SQLHCは、単一のSQL文を分析して、その結果をHTMLファイルに出力するツールです。一回の実行で、オプティマイザ統計やスキーマ・オブジェクトのメタデータ、パフォーマンスに影響する可能性のあるパラメーターなどを取得できます。SQLの詳細データが取得できるので、急なパフォーマンス劣化や結果不正が発生したときの解析に役立ちます。

SQLは重要

リレーショナルデータベースでは、いろいろな意味でSQLが重要です。SQLはデータベースを操作する最小単位であり、さまざまなトラブルの起点となります。またSQLは、書き方によって大きくパフォーマンスに影響することも知られています。本来であれば一文で書けるところを複数に分けてしまったり、まとまった集合演算すべきところを1件ずつループさせてしまったりなどは、よくある失敗です。

とくに後者はあとで発見しづらいので厄介です。AWR/Statspack等でSQLを調べても、個別のSQLに問題はないことが多いからです。その場合には、アプリケーションロジック全体を精査して初めて問題のある箇所を発見できます。

改善策は、関連するアプリケーションロジック全体の書き換えです。非常にコストのかかる作業なので、できるだけ避けるような施策を打つべきでしょう。SQLを直接書くときは、ある程度のスキル所有者に限定すべきですし、またコードレビューも欠かせません。

SQLを分析する方法いろいろ

SQLを分析するにはいくつかの方法があります。代表的な方法としては、次のものが挙げられます。とくに1)と2)は簡単に使えるので、SQLを直接書くようなアプリケーション開発者は覚えておいたほうがよいでしょう。DBAならば当然覚えておくべき事項です。


  1. EXPLAIN PLAN
  2. SQL*PlusのAUTOTRACE
  3. V$SQL_PLANおよび関連ビュー
  4. SQLトレース/tkprof
  5. Oracle Enterprise Manager Diagnostics Pack / Tuning Pack
  6. イベント 10046/10053 トレース

そして今回紹介するSQLHCは、5)と6)を合わせて簡易版にしたようなもので、ある程度高度な分析が必要なときに使用します。

また「SQLT(SQLTXPLAIN)」というツールをご存知の方もいるかもしれません。こちらはSQLHC以上に高機能なツールです。しかし事前にインストールする必要があり(DBにスキーマやパッケージを作成)、またSQLによってはシステム負荷が大きいなどの特徴があります。そのため「インストール不要」「システム負荷最少(1分程度)」簡易版としてSQLHCが作成されました。同じルーツを持っているので、レポートの見方も似ています。どちらかを一度覚えておくと便利です。

SQLTの認知度はイマイチですが、オラクル社の製品サポートサイトではたくさんの資料が公開されています。また米国では"Oracle SQL Tuning with SQLTXPLAIN"という市販書籍がAPRESS社から出版されているほどです。こちらの書籍はSQLHCを使うときにも役立ちます。

SQLHCを使ってみる

SQLHCのライセンスは無料で、オラクル社の製品サポートサイトからダウンロードできます。サポート対象DBのバージョンは10g以降、エディションはPE, SE One, SE, EEです。分析対象のデータベースエディションがEEで、Diagnostics PackかTuning Packのライセンスがあると、より詳細なレポートを出力できます。

インストール方法は、次のようにzipファイルを解凍するだけです。解凍されたスクリプトの中からsqlhc.sqlを使います。

$ unzip sqlhc.zip
$ cd sqlhc
$ ls
sqldx.sql  sqlhc.sql  sqlhcxec.sql

実際の使い方は次の通りです。スクリプト名の後ろに、Tuning Pack / Diagnostics Packの接頭辞、その次に分析対象SQLのSQL_IDを指定します。

$ sqlplus / as sysdba
SQL> START sqlhc.sql [T|D|N] SQL_ID

ライセンスPackの頭文字は、T:Tuning、D:Diagnostics、N:Noneのいずれかを指定します。Tuning PackとDiagnostics Packの両方を持っているときはTを指定します。

SQL_IDを取得するには、AWRやStatspackなどのレポートを参照するか、v$sqlareaから検索します。似たSQLが多いときには、次の例のようにコメント部分に見つけやすい文字列を指定します。

SQL> select /* MEJIRUSHI */ count(*) from sales;
SQL> select sql_id, sql_text from v$sqlarea
  2  where sql_text like '%MEJIRUSHI%';

SQL_ID
-------------
SQL_TEXT
--------------------------------------------------
da366xv87avdv
select /* MEJIRUSHI */ count(*) from sales

実際にSQLHCを実行してみましょう。こんどは次のような少し複雑なSQLを解析します。

select country_name, sum(amount_soldCOUNTRY_NAME) from sales s, customers c, countries co where s.cust_id=c.cust_id
  and co.country_id=c.country_id
  and country_name in ('Ireland', 'Denmark', 'Poland', 'Germany') group by country_name order by sum(amount_sold);

このSQLのSQL_IDが3nqqm04sp799wで、Tuning Packのライセンスがある場合には、次のように実行します。

$ sqlplus / as sysdba
SQL> START sqlhc T 3nqqm04sp799w

しばらく画面が流れたあとに、ファイル名が表示されたら終了です。カレントディレクトリを確認するとzipファイルが出力されています。

$ ls *zip
sqlhc_20150205_030010_3nqqm04sp799w.zip

このzipファイルには、いくつかのhtmlファイルとzipファイルが含まれています。内容を表示するにはWebブラウザが必要なので、実際の環境ではzipファイルをクライアントに転送したほうがよいかもしれません。

$ unzip sqlhc_20150205_030010_3nqqm04sp799w.zip
Archive:  sqlhc_20150205_030010_3nqqm04sp799w.zip
  inflating: sqlhc_20150205_030010_3nqqm04sp799w_1_health_check.html
  inflating: sqlhc_20150205_030010_3nqqm04sp799w_2_diagnostics.html
  inflating: sqlhc_20150205_030010_3nqqm04sp799w_3_execution_plans.html
  inflating: sqlhc_20150205_030010_3nqqm04sp799w_4_sql_detail.html
 extracting: sqlhc_20150205_030010_3nqqm04sp799w_8_sqldx.zip
 extracting: sqlhc_20150205_030010_3nqqm04sp799w_9_log.zip

SQLHCレポートを見る

レポートの種類 内容
health_check ヘルスチェックの主要レポート。注目するべき点やテーブル、インデックスのサマリなど
diagnostics SQLの統計情報やオブジェクトの情報、データベースのパラメーターなど多岐にわたった情報
execution_plans SQLの実行計画。現在の実行計画だけでなく、過去の実行計画も含まれる
sql_detail Oracle Enterprise ManagerのSQL詳細画面相当。ブラウザにはFlashプラグインが必要

まずHealth Checkレポートから見てみましょう。この中で重要なのは最初のObservations(注目、観察)セクションです。おもにコストベース・オプティマイザに関するもので、デフォルト値以外になっているパラメーターや推奨事項などが表示されます。この画面ショットでは2項目だけですが、実際には10個以上表示されていました。

Health Checkレポート画面

またその下には、このSQLがアクセスしているテーブルやインデックスの統計情報が表示されます。オブジェクトの統計情報を取得した日時や、オブジェクトのサイズ等が表示されます

統計情報画面

次にdiagnosticsレポートです。こちらの内容は、次の目次をみても分かるように、多岐にわたっています。それぞれがハイパーリンクになっているので、見たいところをクリックすれば移動します

diagnosticsレポート画面

これだけあるとどこから見ればよいのか迷いますね。解決したい課題にもよりますが、とりあえず見るならば、次の項目あたりでしょうか。

  • Current Plans Summary:SQL文1実行あたりの平均統計
  • System Parameters with Non-Default or Modified Values:デフォルト値以外になっている初期化パラメーター

Current Plans Summary画面
System Parameters with Non-Default or Modified Values画面

そして3つ目のレポートがexecution plansです。名前の通り、このレポートには実行計画が含まれています。またAWRから実行計画履歴を取得するので、実行計画が変わっているときには以前の実行計画も表示できます。

execution plans画面

おわりに

レポートの量と比較すると、簡単な解説になってしまいましたが、いかがでしょうか? システム開発の途中であれば、まずはAUTOTRACEなどを使ってみるべきですが、さらに深く調べたい場合に一回にたくさんのデータが取れるSQLHCは便利です。
内容を読み解くためには、それなりのスキルが必要です。でもDBAを職業とする方も、ざっくりでもいいので覚えておきたいところです。

またSQLTとの使い分けについては、最初にSQLHC、それでもわからないときはSQLTの順番で使うことをオラクル社は推奨しています(SQLHCは負荷が低く、インストール不要なため)。実際のところSQLTは運用ルールなどで、特に本番環境では使用できないことも多いのですが、いずれにしてもいきなり使うのは厳しいので、運用開始前にテスト・開発環境で試しておくことをお薦めします。

にわかワイン通養成講座

第4回 お店でワインを注文するときの心得

ワインで迷うことの一つが飲食店での注文です。居酒屋やファミレスなどでは「財布や参加メンバーを考慮して、問題の無いものを注文すべき」なのですが、もう少しグレードの高いところでは勝手が違います。いくつかの悩みについて考えてみます。

疑問1.注文するワインの値段は、どのくらいが適切なのか?

一般的にはコース料理の値段と同じくらいと言われています。たとえば5千円のコースならば5千円くらいです。とはいえ、世の中にはいろいろなお店があるので、ひとまとめに考えるのは厳しいものがあります。

個人的な考えで言えば、お店のグレードにあったワイン選びです。つまり、高級店であれば、それにふさわしいワイン。リーズナブルなお店であれば、リーズナブルなワインです。

人間の味覚はいい加減です。お店の雰囲気や一緒に食べた料理、誰と飲んだかなど、周辺の要素に大きく影響されます。リーズナブルなお店で高級ワインを飲んでも、そのよさを発揮できないことの方が多いと思っています。

だって初デートのときに飲んだお酒と、苦手な先輩と飲んだお酒では、同じものでも印象は違いますよね。初デートのときは緊張して、どんな味だか覚えてないなんてオチはあるかもしれませんが。

わたしが本格的にワインを飲み始めた十数年前「安いワインなんて飲めない」とばかりに、リーズナブルな店でも、それなりに高いワインを飲んでいたことがあります。でも会計したときの満足度はイマイチでした。きっと安いワインでも満足度は大きく変わらなかったと思っています。

疑問2.料理との相性はどのように考えるべきなのか?

本音を言ってしまえば、それほど深く考える必要はありません。自分の飲みたいワインを飲むべきです。日本では「日本酒の文化」や「暑い気候」もあって白もよく飲みますが、ヨーロッパで飲まれているワインのほとんどは赤です。ヨーロッパは地域性が強いので一概には言えませんが、場所によっては赤ワインしかワインリストに載っていないこともあります。

それでもポイントを挙げるならば、2つあります。「料理の色」と「味の濃さ」です。つまり白っぽい料理には白。赤っぽい料理には赤です。またしっかりした味の料理には、しっかりしたワインです。ワインの厚みのことをボディと言います。

たとえば肉でも豚しゃぶのようなものならば白が合います。また魚でも醤油の煮つけならば、赤が合います。グラタンのようなこってりとしたものなら、シャルドネ種を使った、しっかりした白が合います。

そして知っておきたい言葉があります。それは「マリアージュ」という言葉です。元々はフランス語で「結婚」を意味する単語なのですが、それが転じて料理とワインの相性を表す言葉として使われています。たとえば

「このワインと、この料理のマリアージュは最高だね」

のように使います。

疑問3.注文したときの味見はどうすればよいのか?

ワイン初心者が緊張するのがワインの味見です。ある程度高級な店でボトルワインを注文すると、少しだけワインを注がれて、味見を促されることがあります。これをホストテイスティングと言います。

ホストテイスティングの本来の目的は、ホスト役(主催者)の人が、もてなすゲストのために「注文したワインが悪くなっていないかどうか」を確認することです。味見をして問題が無いようだったら「おいしいです」と返事をすればOKです。「自分の好みの味かどうか」を聞かれているわけではありません。だから、好みではないからと言ってワインを交換してもらうことはできないので気を付けてください。

ワインの劣化にはいくつかの種類があり、もっともひどいのがコルク臭(ブショネ)です。

コルクを消毒した薬品の残留物によるもので、青カビっぽい香りがします。気付きづらい軽度のものから、まったく飲めないようなひどいものまで様々です。近年は低減傾向にあるようですが、5%前後の割合で存在すると言われています。

コルク臭だったときには無料で交換してくれます。とはいえ軽度のものは、人によって感じ方が違うので、信頼関係のあるお店以外では言いづらいのも事実です。せっかく楽しむためにレストランに訪問しているのに、お店の人と険悪な雰囲気になりたくないですからね。

さらに悩ましいのが居酒屋やファミレスなど、あきらかにワインの専門家がいない店で遭遇したときです。わたし自身も何度か遭遇したことがあります。そのたびに言おうか言うまいか散々迷います。場合によっては、単なるクレーマー扱いされるかもしれませんからね。とはいえ、お店の人に指摘した2回中2回の割合で、あっさりと交換してもらえました。運がよかっただけなのかもしれませんが...。