IBM Support

[Db2] SQL0952N の原因と対処方法

Question & Answer


Question

アプリケーションから SQL ステートメントを実行すると、SQL0952N で失敗することがあります。 原因と対処方法を教えてください。

Answer

多くの場合、SQL0952N はアプリケーションが設定した照会タイムアウトを超過したために、アプリケーションがキャンセル要求を発行した結果です。
このため、SQL0952N を回避するには、次の 2 つのアプローチがあります。
  1. 照会タイムアウトを延長する、もしくは無効化する
  2. 照会タイムアウトを超過するステートメントのパフォーマンスを調整する

この文書では、双方のアプローチの具体的な手法を案内します。

a) 照会タイムアウトの延長もしくは無効化

照会タイムアウトは各アプリケーション・インターフェースによって設定方法が異なります。
お使いのアプリケーションのインターフェースに応じて設定を変更もしくは無効化してください。
設定方法が複数記述されているものは、上位のものほど優先されます。

a-1) Java
  • java.sql.Statement の setQueryTimeout メソッド
    デフォルト 0 (タイムアウトなし)

  • String sql = "SELECT C2 FROM T1 WHERE C1=?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setQueryTimeout(10);

  • Jcc ドライバーの commandTimeout プロパティ
  • (WebSphere Application Server を使っている場合)
    WAS データソースの webSphereDefaultQueryTimeout

a-2) CLI
  • ステートメントの SQL_ATTR_QUERY_TIMEOUT 属性
    デフォルト 0 (タイムアウトなし)
  • db2dsdriver.cfg の QueryTimeout (v9.7fp6 以降)

a-3) 組み込み SQL (*.sqc/*.sqb)
  • db2dsdriver.cfg の QueryTimeout (v10.1fp2 以降)

a-4) ADO
  • Connection または Command オブジェクトの CommandTimeout プロパティ
    デフォルト 30 秒

  • Set Cmd = CreateObject("ADODB.Command")
    Cmd.CommandTimeout = 10

a-5) .NET (IBM.Data.DB2 を使用)
注: 他のデータ・プロバイダーを使う .NET アプリケーションは、そのプロバイダーの動作に準拠します。

注: ADO などを含め、CLI インターフェースを利用したアプリケーションの場合、CLI 構成ファイルの QueryTimeoutInterval で照会タイムアウトの検出間隔を調整できます。
QueryTimeoutInterval を 0 にすると、タイムアウトを検出しなくなり、アプリケーションの設定は無視されます。
なお、QueryTimeoutInterval のデフォルトは以下の通りです。
V9.5、V9.7 FP5 以前、V10.1 FP0: 5 秒
V9.7 FP6 以降、V10.1 FP1 以降: 1 秒

b) SQL ステートメントのパフォーマンスを調整

SQL ステートメントが照会タイムアウトまでに完了しない原因として、以下のケースが考えられます。

b-1) SQL 自体が遅い
  • SQL0952N で失敗する SQL を特定し、RUNSTATS コマンドで SQL が参照している表の統計情報を更新します。
    統計を更新しても SQL が期待通りの時間で完了しない場合、マニュアルを参照してパフォーマンスを調整してください。
    パフォーマンスの概要

b-2) ロック待機
運用上の考慮点
  • 照会タイムアウトの有効範囲
    照会タイムアウトは、SELECT ステートメントだけでなく、UPDATE/INSERT/DELETE ステートメントなどにも有効です。
    SELECT の場合、カーソルのオープンでは照会タイムアウトが有効ですが、個々のレコードのフェッチでは必ずしも照会タイムアウトは有効になりません。

  • 組み込み SQL アプリケーション
    V10.1 FP1 以前のクライアントでは組み込み SQL には照会タイムアウトを設定できません。
    このケースで組み込み SQL から SQL0952N が返った場合は、SQL 実行中に Ctrl+C などによって割り込みが送られた可能性があります。
    例えば、組み込み SQL アプリケーションであるコマンド行プロセッサー (CLP) で、ロック待機中に Ctrl+C を入力すると、ロック待機しているステートメントは SQL0952N で終了します。
関連情報
パスポート・アドバンテージによく寄せられる質問
SQL0952N
QueryTimeout IBM Data Server Driver 構成キーワード
QueryTimeoutInterval CLI/ODBC 構成キーワード
db2cli.ini 初期設定ファイル
ステートメント属性 (CLI) のリスト

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkdAAE","label":"Connectivity"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0;9.7.0","Line of Business":{"code":"LOB10","label":"Data and AI"}}]

Document Information

Modified date:
23 August 2023

UID

swg21632578