TL; DR:内側のクエリでを使用してください。
内部クエリ
Select a, max(x) as b from Tbl1 group by a
はparallizableではありません。部分的な結果は並行して計算できますが、max(x)
の各値がa
'であることを知るためには、1つの場所で実行する必要があります。外部クエリにJOIN EACH
を使用すると、JOIN
の実行を並列化する必要があることがクエリエンジンに指示されます。ただし、パラレル化可能なソースがないため、クエリは失敗します。
これを修正するには2つの方法があります:最初は、明示的に並列のバージョンの内部クエリを使用します。GROUP BY
の代わりにを使用します。最初のステップは、a
フィールドで基になるテーブルをソートすることで、並列ワーカーのa
フィールドあたりのグローバル最大値を計算できるため、これは並列で実行できます。内部問合せがパラレル化可能である場合、外部問合せもパラレルで実行できます。
Select Table1.a,Table1.b,Table2.c
From
(Select a, max(x) as b
from Tbl1
group EACH by a -- note the EACH keyword here
) as Table1
LEFT JOIN EACH Table2
ON
Join Condition
目のオプションが外部クエリにJOIN
の代わりJOIN EACH
を使用することです。これは次のようになります。これは、Table2のサイズに応じてサイズ制限が発生する可能性があります(非ジョインを行うために、右側のテーブルは「小さい」必要があります)。
これは明らかに準最適です。クエリを実行するためにクエリエンジンがどのように機能するかを理解する必要があります。つまり、私たち(bigqueryチームとdremelチーム)は、この種の問題に対処する必要がないように、クエリーを「仕事をする」ことに熱心に取り組んでいます。私たちはこれについていくつかの進歩を遂げていますが、過去数ヶ月間にいくつかのタイプのエラーが取り除かれました(例えば、最近まで内部結合が失敗してしまったなど)が、まだ方法があります。
私たちの注意を喚起してくれてありがとう。私は内部のバグを提出したので、将来この問題を改善することができます。