2

クエリの実行

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

〜20秒で成功します

ただし、これにWHERE句を追加すると、返される行の数が減ります。

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
WHERE log_time > 0
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

「応答が大きすぎて返せません」というエラーが発生します。

私の予想では、返される行を制限すると、スキャンする必要のある行が増えるため実行時間が長くなりますが、応答は同じサイズである必要があります。私は何が欠けていますか?

4

1 に答える 1

3

まず、スキャンされる行数は一定です。BigQueryは(設計上)行にインデックスを付けず、指定したテーブルに対して全表スキャンを実行します。

このm-labテーブルには数十億の行があるため、ここでの一般的な問題は、複数のGROUP BYを介して生成される一意の結果の量が両方のクエリで非常に多く、 BigQuery実行ツリー。

1つのアプローチ:

このクエリにアプローチする1つの方法は、と呼ばれる新しい機能を使用することGROUP EACH BYです。これにより、シャッフル操作が適用され、サービングツリー全体でグループ化のバランスが取られます。GROUP「バケット」ごとに多数の個別の値がある場合に最適に機能します。m-labデータセットでは、ほとんどすべてのエントリがプロジェクト「0」に関連付けられているため、クエリ結果からそれを削除しGROUP EACH BY、他のより多くの値を削除します。

SELECT test_id, log_time,  connection_spec.client_geolocation.latitude,  connection_spec.client_geolocation.longitude
FROM
  [measurement-lab:m_lab.2012_11]
WHERE
  log_time > 0 AND project = 0
GROUP EACH BY
  test_id, log_time, connection_spec.client_geolocation.latitude,   connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6;

別の戦略:

クエリを実行している結果は、log_timeの順に結果を一覧表示します。つまり、実際には、最も古いlog_timeデータポイントのみを返します。ある時点のグループに対して副選択を実行してから、WHERE句の結果セットを使用してGROUPBYを実行してみませんか。このクエリは、他の例よりもはるかに高速に実行されるはずです。

SELECT
  test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude, COUNT(*) AS entry_count      
FROM
  [measurement-lab:m_lab.2012_11]
WHERE
  project = 0 AND log_time IN
  (SELECT log_time FROM [measurement-lab:m_lab.2012_11] WHERE log_time > 0 GROUP BY log_time ORDER BY log_time LIMIT 6)
GROUP BY
  test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude  ORDER BY log_time, entry_count;
于 2012-11-20T23:44:43.180 に答える