SQL実行時に「クエリ プロセッサはクエリ プランを作成できませんでした。作業テーブルが必要で、最小行サイズが許容最大値 8060 バイトを超えています。」
のエラーが発生する現象と対処法を紹介します。
SQLを実行すると、以下のエラーが発生します。
英語版では以下のメッセージになります。
多数のテーブルをJOINするSQLで発生する場合があります。単純にJOINしただけでは発生するケースは稀で、
フルテキストインデックス検索を利用すると、発生することがあります。
SELECT文で取得する列を減らすと解消される場合があります。
SELECT * FROM MyTable
LEFT JOIN MyTable2 on ....
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
WHERE ....
ORDER BY ....
必要となる値のみをSELECTで取得します。
SELECT id, value1, value2 FROM MyTable
LEFT JOIN MyTable2 on ....
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
WHERE ....
ORDER BY ....
JOINによるテーブルの結合がある場合、"*" はすべてのテーブルに対する列の取得になるため、(テーブル名).*
の記述に変更すると解消される場合があります。
SELECT * FROM MyTable
LEFT JOIN MyTable2 on ....
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
WHERE ....
ORDER BY ....
SELECT MyTable.*, MyTable2.AA, MyTable3.BB, MyTable4.* FROM MyTable
LEFT JOIN MyTable2 on ....
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
WHERE ....
ORDER BY ....
可変のカラムがある場合、WHEREで絞り込んだ結果に対してJOINを実行すると解消される場合があります。
SELECT * FROM MyTable
LEFT JOIN MyTable2 on ....
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
WHERE ....
ORDER BY ....
この方法は、条件式での検索時に、一部のテーブルの結合のみで判定できる場合にのみ利用できます。
また、検索によりレコードの数が大きく減る場合は有効ですが、検索語のレコード数が多い場合には解消されない場合もあります。
SELECT R1.* FROM (
SELECT MyTable.* FROM MyTable
LEFT JOIN MyTable2 on ....
WHERE ....
) as R1
LEFT JOIN MyTable3 on ....
LEFT JOIN MyTable4 on ....
ORDER BY ....