クエリ計算の最適化

クエリによって要求されるコンピューティングを評価する場合は、必要な作業量を検討します。どのくらいの CPU 時間が必要か?追加の CPU リソースが必要な JavaScript ユーザー定義関数などの関数を使用していないか?

以下のおすすめの方法は、クエリ コンピューティングを抑えるガイダンスを提供します。

SQL クエリ経由のデータの繰り返し変換を避ける

おすすめの方法: SQL を使用して ETL オペレーションを実行する場合は、同じデータを繰り返し変換する状況を避けてください。

たとえば、SQL を使用して文字列をトリミングしたり、正規表現を使用してデータを抽出したりする場合は、宛先テーブルで変換結果を実体化する方がパフォーマンスが向上します。正規表現のような関数には追加のコンピューティングが必要です。追加される変換オーバーヘッドなしに宛先テーブルを照会する方がはるかに効率的です。

JavaScript ユーザー定義関数を避ける

おすすめの方法: JavaScript ユーザー定義関数の使用を避けてください。代わりに、ネイティブ UDF を使用します。

JavaScript UDF を呼び出すには、サブプロセスをインスタンス化する必要があります。このプロセスをスピンアップして UDF を実行すると、クエリのパフォーマンスに直接影響します。可能であれば、代わりにネイティブ(SQL)UDF を使用してください。

近似集計関数を使用する

おすすめの方法: ユースケースでサポートされていれば、近似集計関数を使用します。

使用している SQL 集計関数に同等の近似関数がある場合は、近似関数を使用すればクエリのパフォーマンスが向上します。たとえば、COUNT(DISTINCT) を使用する代わりに、APPROX_COUNT_DISTINCT() を使用します。詳細については、標準 SQL リファレンスの近似集計関数をご覧ください。

また、HyperLogLog++ 関数を使用して近似(カスタム近似集計を含む)を行うこともできます。詳細については、標準 SQL リファレンスの HyperLogLog 関数をご覧ください。

パフォーマンスが最大化するようにクエリ オペレーションを並べ替える

おすすめの方法: 最も外側のクエリ内またはウィンドウ句(分析関数)内でのみ ORDER BY を使用します。複雑なオペレーションをクエリの最後に配置します。

データを並べ替える必要がある場合は、最初にフィルタ処理して、並べ替える必要がある値の数を減らします。最初にデータを並べ替えると、必要以上に多くのデータを並べ替えなければならなくなります。すべてのデータを並べ替えてから LIMIT 句を適用するよりもデータのサブセットを並べ替える方が望ましいです。

ORDER BY 句を使用する場合は、最も外側のクエリにのみ配置する必要があります。クエリの途中に ORDER BY 句を配置すると、ウィンドウ(分析)関数で使用されている場合を除いて、パフォーマンスに大きく影響します。

クエリを並べ替える別の方法は、正規表現や数学関数などの複雑なオペレーションをクエリの最後に配置することです。このテクニックを使用した場合も、複雑なオペレーションが実行される前にデータを可能な限り削減できます。

結合パターンを最適化する

おすすめの方法: 複数のテーブルのデータを結合するクエリの場合は、結合パターンを最適化します。最大のテーブルから始めます。

JOIN を使用してクエリを作成する場合は、データを結合する順序を考慮してください。標準の SQL クエリ オプティマイザを使用すれば、結合のどちら側にどのテーブルを配置するかを決定できますが、結合するテーブルを適切に並べ替えることもおすすめします。おすすめの方法は、最初に最大のテーブルを配置し、その後ろに最小のテーブルを配置することです。それより後は、サイズの大きい順にテーブルを配置していきます。

大きいテーブルを JOIN の左側に配置し、小さいテーブルを JOIN の右側に配置した場合は、ブロードキャスト結合が形成されます。ブロードキャスト結合は、小さいテーブル内のすべてのデータを大きいテーブルを処理する各スロットに送信します。ブロードキャスト結合を最初に実行することをおすすめします。

JOIN 内のテーブルのサイズを表示するには、テーブルに関する情報の取得をご覧ください。

分割されたクエリを取り除く

おすすめの方法: 時間分割テーブルをクエリする場合は、_PARTITIONTIME 疑似列を使用してパーティションをフィルタリングします。

分割テーブルを照会する場合は _PARTITIONTIME 疑似列を使用してください。_PARTITIONTIME を使用すると、日付または日付の範囲を指定してデータをフィルタリングできます。たとえば、次の WHERE 句では、_PARTITIONTIME 疑似列を使用して、2016 年 1 月 1 日から 2016 年 1 月 31 日までのパーティションを指定しています。

WHERE _PARTITIONTIME
BETWEEN TIMESTAMP(“20160101”)
    AND TIMESTAMP(“20160131”)

このクエリは、日付範囲で指定されたパーティション内のデータのみを処理します。パーティションをフィルタ処理すると、クエリのパフォーマンスが向上し、コストが削減されます。

このページは役立ちましたか?評価をお願いいたします。

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

ご不明な点がありましたら、Google のサポートページをご覧ください。