カーソル・エラーとオブジェクトの問題切り分け:Oracleパフォーマンス障害の克服(7)(1/2 ページ)
Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局)
今回は「問題解決に有効な6つのステップ」の4ステップ目である「システム設定項目の確認」の続きとして、カーソルをはじめとしたOracleの内部処理単位であるオブジェクトに焦点を当て、パフォーマンス障害の原因を探っていきます。
カーソル数不足によるエラーを回避する
セッションに対して負荷の高いアプリケーションを作成する場合、効率的に処理を行わせるために、PL/SQLストアド・プロシージャやデータベースリンクを使用することが多いと思います。PL/SQLストアド・プロシージャで使用するカーソルは、必要とする検索結果のみをクライアント側で取得できるため、プログラマとしては非常に便利なのですが、プログラミング時にカーソルの使い方を正しく意識していないと、高い負荷を与えたときに「ORA-01000」エラーを誘発することが往々にしてあります。このカーソル・エラーの原因を考えていきましょう。
[エラー番号] | ORA-01000 |
---|---|
[エラーメッセージ] | 最大オープン・カーソル数を超えました。 |
[エラー原因] | ホスト言語プログラムがオープンしようとしているカーソルの数が多すぎます。1ユーザー当たりのカーソルの最大数は、初期化パラメータOPEN_CURSORSによって決定されています。 |
[エラー処置] | プログラムを変更して、使用するカーソルの数を減らしてください。繰り返しエラーが発生する場合は、Oracleを停止して、OPEN_CURSORSの値を大きくしてから、Oracleを再起動してください。 |
表1 ORA-01000エラーメッセージ |
「ORA-01000」エラーの処置は、使用するカーソルの数を減らすということになりますが、スレッドなどを使用しているマルチタスクのアプリケーションや、アプリケーション修正時の2次障害を考えると、アプリケーション側での対応は難しくなるでしょう。従って、初期化パラメータファイル(init.ora)の「OPEN_CURSORS」の値を変更することになるのですが、その際に変更値の指針が必要です。
初期化パラメータ「OPEN_ CURSORS」のデフォルト値はOracle8i以前では「50」、Oracle9iとOracle 10gでは「300」がデフォルトの値になるようです(管理者ガイドなどに明確に記載されているわけではなく、インストール時の値を確認した内容です)。まずこの値の確認と変更です。もちろん初期化パラメータファイル(init.ora)で確認はできますが、稼働中のサーバでの値を確認する方法は、以下になります。この値は静的パラメータとなりますので、初期化パラメータファイル(init.ora)の値を変更後、インスタンスの再起動が必要となります。
SQL> SHOW PARAMETER OPEN_ CURSORS
変更に当たって、カーソルがどの程度開かれているかを確認しておく必要がありますね。以下の「V$OPEN_CURSOR」で確認できます。このビューは、各ユーザー・セッションが現在すでにオープンして解析しているカーソルを示します。
SQL> DESC V$OPEN_CURSOR
列名 | データ型 | 格納されているデータの内容 |
---|---|---|
SADDR | RAW(4 | 8) | セッション・アドレス |
SID | NUMBER | セッション識別子 |
USER_NAME | VARCHAR2(30) | セッションにログインしているユーザー |
ADDRESS | RAW(4 | 8) | HASH_VALUE とともに使用され、セッションで実行されているSQL 文を一意に識別する |
SQL_TEXT | VARCHAR2(60) | オープン・カーソルに解析されるSQL文の最初の60文字 |
表2 V$OPEN_CURSOR動的パフォーマンスビュー(抜粋) |
セッションごとに使用されるカーソルの数をユーザー名をキーにして検索します。高負荷時にここで得られた結果が初期化パラメータ「OPEN_CURSORS」の近くまで増大している場合、値を変更する必要があります。
SQL> SELECT SID AS セッションID, USER_NAME AS ユーザ名, COUNT(SID) AS カーソル数 FROM V$OPEN_CURSOR WHERE USER_NAME = '[ユーザ名]' GROUP BY SID,USER_NAME;
セッションごとに最大カーソル数が決定されますので、同じユーザーでもセッションごとにその数を確認する必要があります。
(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.