カーソル・エラーとオブジェクトの問題切り分けOracleパフォーマンス障害の克服(7)(1/2 ページ)

Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局)

» 2005年03月12日 00時00分 公開
[高橋潤@IT]

 今回は「問題解決に有効な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
リスト1 初期化パラメータ「OPEN_ CURSORS」を確認

図1 リスト1の出力結果 図1 リスト1の出力結果

 変更に当たって、カーソルがどの程度開かれているかを確認しておく必要がありますね。以下の「V$OPEN_CURSOR」で確認できます。このビューは、各ユーザー・セッションが現在すでにオープンして解析しているカーソルを示します。

SQL> DESC V$OPEN_CURSOR
リスト2 「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;
リスト3 カーソルがどの程度開かれているかを確認

 セッションごとに最大カーソル数が決定されますので、同じユーザーでもセッションごとにその数を確認する必要があります。

図2 リスト3の出力結果 図2 リスト3の出力結果

次ページへ続く)

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。