クエリ出力の管理

出力データを評価するときには、クエリによって書き込まれるバイト数を考慮してください。結果セットには何バイト書き込まれますか?書き込まれるデータの量を適切に制限していますか?同じデータを繰り返し書き込んでいますか?クエリによって書き込まれるデータの量は、クエリのパフォーマンス(I/O)に影響します。永久(宛先)テーブルに結果を書き込む場合、書き込まれるデータの量に応じてコストが発生します。

出力データの制御に関する指針となるベスト プラクティスを次に示します。

結合の繰り返しとサブクエリを回避する

ベスト プラクティス: 繰り返し同じテーブルを結合したり、同じサブクエリを使用したりしないでください。

同じテーブルを繰り返し結合している場合は、スキーマの修正を検討してください。データを繰り返し結合するのではなく、データをネストして繰り返す方法で関係を表現する方がパフォーマンスが向上する可能性があります。データをネストして繰り返すと、結合に必要な通信帯域幅が原因で生じるパフォーマンス低下が軽減されます。また、同じデータを繰り返し読み書きすることによって発生する I/O コストも削減できます。詳細については、ネストされたフィールドと繰り返しフィールドの使用をご覧ください。

同様に、同じサブクエリを繰り返すと、クエリ処理が繰り返されるため、パフォーマンスが低下します。複数のクエリで同じサブクエリを使用している場合は、サブクエリの結果をテーブルで実体化し、実体化されたデータをクエリで使用することを検討してください。

サブクエリの結果を実体化することで、パフォーマンスが向上し、BigQuery によって読み書きされるデータの総量が削減されます。実体化されたデータを格納するためのコストは低レベルであるため、I/O やクエリ処理を繰り返す場合よりパフォーマンスが向上します。

大規模な結果セットの実体化を慎重に検討する

ベスト プラクティス: 抽出先テーブルに大規模な結果セットを実体化するかについては、慎重に検討する必要があります。大規模な結果セットを書き込むと、パフォーマンスが低下し、コストが上昇します。

BigQuery にはキャッシュに保存された結果について、圧縮した状態で約 128 MB までという制限があります。大規模な結果を返すクエリはこの制限を上回るため、Response too large というエラーが頻繁に発生します。

このエラーは多くの場合、大量のデータを含むテーブルから多数のフィールドを選択すると発生します。キャッシュに保存された結果の書き込みに関する問題は、データを縮小または集約することなく正規化する ETL スタイルのクエリでも発生する可能性があります。

キャッシュに保存された結果のサイズ制限の問題を解消するには、次のようにします。

  • フィルタを使用して結果セットを制限する
  • ORDER BY 句を使用する場合は特に、LIMIT 句を使用して結果セットを削減する
  • 出力データを宛先テーブルに書き込む

非常に大規模な結果セットを宛先テーブルに書き込むと、クエリのパフォーマンス(I/O)が低下することに注意してください。さらに、宛先テーブルを格納するためのコストが若干発生します。大規模な宛先テーブルを自動的に削除するには、データセットのテーブルのデフォルトの有効期限を使用します。詳細については、ストレージのベスト プラクティスの有効期限の設定を使用するをご覧ください。

大規模な並べ替えで LIMIT 句を使用する

ベスト プラクティス: 非常に多くの値を並べ替える場合は、LIMIT 句を使用します。

ORDER BY 句を使用してクエリの結果を書き込むと、Resources exceeded エラーが発生する可能性があります。最終的な並べ替えは単一のスロットで行う必要があるため、非常に大規模な結果セットを並べ替える場合、最終的な並べ替えが、データを処理するスロットに大きな負荷をかける可能性があります。ORDER BY 句を使用する場合は、LIMIT 句も併せて使用してください。

たとえば、次のクエリの結果セットは非常に大規模となるため、Resources exceeded というエラーが発生します。クエリは Wiki1B テーブルの title 列で並べ替えられます。title 列には数百万個の値が含まれています。

SELECT title
FROM `bigquery-samples.wikipedia_benchmark.Wiki1B`
ORDER BY title

エラーを回避するには、次のようなクエリを使用します。

SELECT title
FROM bigquery-samples.wikipedia_benchmark.Wiki1B
ORDER BY title DESC
LIMIT 1000
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...