SQL実行時に「クエリ プロセッサはクエリ プランを作成できませんでした。作業テーブルが必要で、最小行サイズが許容最大値 8060 バイトを超えています。」のエラーが発生する

SQL実行時に「クエリ プロセッサはクエリ プランを作成できませんでした。作業テーブルが必要で、最小行サイズが許容最大値 8060 バイトを超えています。」 のエラーが発生する現象と対処法を紹介します。

現象

SQLを実行すると、以下のエラーが発生します。

エラーメッセージ
クエリ プロセッサはクエリ プランを作成できませんでした。作業テーブルが必要で、最小行サイズが許容最大値 8060 バイトを超えています。 通常、クエリに GROUP BY または ORDER BY 句が含まれている場合、作業テーブルが必要になります。 クエリに GROUP BY または ORDER BY 句がある場合は、句のフィールドの数を減らすか、サイズを縮小することを検討してください。 グループ化または順序付けのプレフィックスに、プレフィックス (LEFT()) またはハッシュ (CHECKSUM()) のフィールドを使用することを検討してください。 ただし、これによりクエリの動作が変わることに注意してください。


英語版では以下のメッセージになります。

Error message
The query processor could not produce a query plan because a worktable is required, and its minimum row size exceeds the maximum allowable of 8060 bytes. A typical reason why a worktable is required is a GROUP BY or ORDER BY clause in the query. If the query has a GROUP BY or ORDER BY clause, consider reducing the number and/or size of the fields in the clause. Consider using prefix (LEFT()) or hash (CHECKSUM()) of fields for grouping or prefix for ordering. Note however that this will change the behavior of the query.

原因

多数のテーブルをJOINするSQLで発生する場合があります。単純にJOINしただけでは発生するケースは稀で、 フルテキストインデックス検索を利用すると、発生することがあります。

対処法

SELECTで取得する列を減らす

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する

可変のカラムがある場合、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 ....

AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2024-11-24
Copyright © 1995–2025 iPentec all rights reserverd.