最近技術的なことを書いていなかったので、ひさしぶりに技術的なこと。
DB2で起こったエラーについて一つだけ!
DB2の仕様書に書いてあったとかではなく、
実験した結果なので、間違ってたらごめんなさい。
あくまで参考として・・・
<メッセージ>
ERROR [54048] [IBM][CLI Driver][DB2/NT] SQL1585N 十分なページ・サイズを持つ SYSTEM TEMPORARY 表スペースが存在しません。SQLSTATE=54048
<意味>
SYSTEM TEMPORARY表スペースを利用してなんらかの処理(ソートとか)をしようしたが、ページサイズが足りなかった。
<原因> ※ページサイズが4096byteの場合
①.SELECT文で4096byte以上ある列をキーにソートしようとしていた。
②.SELECT文に定義してある列の合計サイズが大きい。
②の場合は、DB2が判断するソート位置によってエラーになる場合とならない場合がある。
エラーにならない場合は、列サイズの大きい行を含む前にソートされており、エラーになる場合は、列サイズの大きい行を含んだ後にソートされている。
このため、ソートキーにより、エラーが発生する場合としない場合が出てくる。
たとえば、↓のSQLがあったとする。
-----------------------
SELECT
A
, CASE B=1 THEN "111"
ELSE "222"
END AS B
, C
FROM TBL
ORDER BY {キー}
-----------------------
※Aがめっちゃサイズが大きな列。
この場合、C列でORDER BY すると、エラーにならないが、
B列(ORDER BY 2)でソートするとエラーになる。
実行計画をみると、C列をキーにソートをかけると、処理の途中でソートが走るが、CASE文を利用した列でソートをかけると、最後にソートされる。
最後にソートされるということは、A列が含まれた形でソートされるため、サイズが増え、エラーが起こる。
<対処法>
①System Temporary表のページサイズを増やす。
②SQLを2回発行し、大きな列と分けて取得する。
この2つかな。
System Temporary表のページサイズを増やす手順(8096byte)は、
---------------------------------
①DBに接続
CONNECT TO DB名
②バッファプールの作成
CREATE BUFFERPOOL TEST_POOL SIZE 256 PAGESIZE 8K
③テーブルスペースの作成だ。
CREATE SYSTEM TEMPORARY TABLESPACE TESTTBS PAGESIZE 8K MANAGED BY DATABASE USING (FILE 'ファイルフルパス' 10240) BUFFERPOOL TEST_POOL
※ファイルフルパスには存在しない適当な名前を指定(ディレクトリは存在していないとダメ)
---------------------------------
だ。
間違ってたらすみません![ガーン](https://stat.ameba.jp/blog/ucs/img/char/char2/141.gif)
DB2で起こったエラーについて一つだけ!
DB2の仕様書に書いてあったとかではなく、
実験した結果なので、間違ってたらごめんなさい。
あくまで参考として・・・
<メッセージ>
ERROR [54048] [IBM][CLI Driver][DB2/NT] SQL1585N 十分なページ・サイズを持つ SYSTEM TEMPORARY 表スペースが存在しません。SQLSTATE=54048
<意味>
SYSTEM TEMPORARY表スペースを利用してなんらかの処理(ソートとか)をしようしたが、ページサイズが足りなかった。
<原因> ※ページサイズが4096byteの場合
①.SELECT文で4096byte以上ある列をキーにソートしようとしていた。
②.SELECT文に定義してある列の合計サイズが大きい。
②の場合は、DB2が判断するソート位置によってエラーになる場合とならない場合がある。
エラーにならない場合は、列サイズの大きい行を含む前にソートされており、エラーになる場合は、列サイズの大きい行を含んだ後にソートされている。
このため、ソートキーにより、エラーが発生する場合としない場合が出てくる。
たとえば、↓のSQLがあったとする。
-----------------------
SELECT
A
, CASE B=1 THEN "111"
ELSE "222"
END AS B
, C
FROM TBL
ORDER BY {キー}
-----------------------
※Aがめっちゃサイズが大きな列。
この場合、C列でORDER BY すると、エラーにならないが、
B列(ORDER BY 2)でソートするとエラーになる。
実行計画をみると、C列をキーにソートをかけると、処理の途中でソートが走るが、CASE文を利用した列でソートをかけると、最後にソートされる。
最後にソートされるということは、A列が含まれた形でソートされるため、サイズが増え、エラーが起こる。
<対処法>
①System Temporary表のページサイズを増やす。
②SQLを2回発行し、大きな列と分けて取得する。
この2つかな。
System Temporary表のページサイズを増やす手順(8096byte)は、
---------------------------------
①DBに接続
CONNECT TO DB名
②バッファプールの作成
CREATE BUFFERPOOL TEST_POOL SIZE 256 PAGESIZE 8K
③テーブルスペースの作成だ。
CREATE SYSTEM TEMPORARY TABLESPACE TESTTBS PAGESIZE 8K MANAGED BY DATABASE USING (FILE 'ファイルフルパス' 10240) BUFFERPOOL TEST_POOL
※ファイルフルパスには存在しない適当な名前を指定(ディレクトリは存在していないとダメ)
---------------------------------
だ。
間違ってたらすみません
![ガーン](https://stat.ameba.jp/blog/ucs/img/char/char2/141.gif)