最近技術的なことを書いていなかったので、ひさしぶりに技術的なこと。

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
※ファイルフルパスには存在しない適当な名前を指定(ディレクトリは存在していないとダメ)

---------------------------------

だ。

間違ってたらすみませんガーン