1

私はbigqueryで遊んでいて、問題に遭遇しました.私のクエリは次のとおりです:

SELECT * FROM (
SELECT a.title,  a.counter , MAX(b.num_characters) as max
FROM (
  SELECT title, count(*) as counter FROM publicdata:samples.wikipedia
  GROUP EACH BY title
  ORDER BY counter DESC
  LIMIT 10
) a JOIN
(SELECT title,num_characters FROM publicdata:samples.wikipedia
) b ON a.title = b.title
GROUP BY a.title, a.counter)
LIMIT 1;

これは有効ですが、応答が大きすぎて返せません。最初のサブクエリは正常に実行されています。私がやりたいことは、そのためにもう少し列を取得することです。しかし、私は失敗します。

4

1 に答える 1

2

「制限 1」について心配する必要はありません。その段階に到達する前に応答が大きくなりすぎます。

2 番目のサブクエリをスキップしてみてください。これは、大きなデータセットから 2 つの列のみを選択し、フィルタリングせずに行うためです。有効な代替手段は次のとおりです。

SELECT
  a.title, a.counter, MAX(b.num_characters) AS max
FROM
  publicdata:samples.wikipedia b JOIN(
  SELECT
    title, COUNT(*) AS counter
  FROM
    publicdata:samples.wikipedia
    GROUP EACH BY title
  ORDER BY
    counter DESC
  LIMIT 10) a
  ON a.title = b.title
GROUP BY
  a.title,
  a.counter

これは 15.4 秒で実行されます。

TOP() を使用すると、より高速に実行できます。

SELECT
  a.title title, counter, MAX(num_characters) max
FROM
  publicdata:samples.wikipedia b
JOIN
  (
  SELECT
    TOP(title, 10) AS title, COUNT(*) AS counter
  FROM
    publicdata:samples.wikipedia
    ) a
  ON a.title=b.title
GROUP BY
  title, counter

TOP() は、よりシンプルで高速に機能します (SELECT COUNT(*)/GROUP/LIMIT)。

https://developers.google.com/bigquery/docs/query-reference#top-function

現在、わずか 6.5 秒で実行され、15.9 GB を処理しています。

于 2013-05-09T05:50:19.170 に答える