Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局)
前回「障害発生! 問題切り分けはスピード勝負」では、Oracleデータベース・サーバの管理や障害対策など、問題解決に有効と考えられる「問題解決に有効な6ステップ」を紹介しました。「第0ステップ ログの確認」「第1ステップ CPU/メモリの監視」は、日々の運用でサーバの状態を確認できる有効な手段であると理解できたと思います。本稿では問題の切り分けを明確に行うための「第2ステップ SQL処理にかかわる確認」を説明します。
前述の「問題解決に有効な6ステップ」の第2ステップにSQL文の確認を挙げたのは、データベース・サーバの状態を変化させる要因は、ユーザーから日々頻繁に起こる要求に起因することが多いと考えるからです。まずは、この視点から問題解決へのステップを進めていきましょう。
実際の確認の手順を示す前に、Oracleデータベース・サーバがSQL文を処理し、ユーザーに対して処理結果を返すまでの動作に関連するキーワードを明確にしておきます。
キーワード | 説明 | |
問い合わせ (SELECT) |
解析処理 | ●サーバ・プロセスによりSQL文の構文を検証する ・データディクショナリをチェックし、表の定義を検証する ・SQL文の対象となるスキーマ・オブジェクトへのアクセス権限を検証する ●SQL文に対する最適な実行計画を決定し、実行計画を共有プールに格納する |
実行処理 | ●実行計画に基づいた要求を実行する ・対象となるデータがSGAに存在しない場合、サーバ・プロセスがデータファイルからデータ・ブロックをSGAに読み込む |
|
フェッチ処理 | ●実行結果をユーザー・プロセスに対し返す ・実行結果に基づき繰り返しフェッチ処理を行う |
|
更新 (UPDATE、 INSERT) |
解析処理 | 上記解析処理と同じ |
実行処理 | ●上記実行処理のほかにUPDATE文の場合以下の処理が行われる ・変更対象となる行をロックする ・変更情報をREDOログ・バッファに格納する ・変更前情報をUNDOセグメントに書き込む ・元データを新データに更新する |
|
トランザクション | データベースへの接続、データの検索・更新、データベースへの接続の切断など関連する処理を1つの処理として管理し、処理が完了するまでのデータの有効性を保証するもの | |
インデックス | データの要素を基に情報を管理し、その情報から元データを高速に検索するための情報 |
表1 SQL処理にまつわるOracleのキーワード |
問い合わせや更新における各処理は、実行計画や実行結果などを格納するSGAなどの領域が正しく設定されているかが重要となりますので、この解説は「第3ステップ SGAの調整」で解説します。本稿では、ユーザーからの要求であるSQL処理全体に着目していきましょう。
複数のユーザーから処理が要求されるマルチ接続のデータベースには、読み取り一貫性という考え方が適用されています。これはユーザーが処理を要求し、その結果が確定されるまで、以前のデータが保証されるというものです。また、複雑に構成された複数のデータ構造を保証するには、データベース内での表データなどの構造が保証されなければなりません。この2点はデータを更新する際に重要な考え方です。
データベース・サーバで問題となるのは、「ロックがきちんと解放されない状況では、次の処理を行えない」ということです。やっかいなことにSQL処理によるロックの問題は、きちんとトランザクションの解放が行われていない場合などでは、サーバ上の問題に見えることがあります。しかし、トランザクションの一連の処理はSQL文によるアプリケーション側の制御ですので、サーバの問題と明確に切り分ける第一歩となります。まずはロックに着目して、問題解決につなげましょう。
ここでデータベース管理者が知りたい情報を整理してみましょう。
それでは次ページで、動的パフォーマンスビューを使って問題となっているロックを特定していく作業を解説しましょう。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.