1

举个例子:

说我已经采取了table_1;按天对其进行分区并将其聚类,shop我尝试使用shopin列表table_2(非聚类或分区)从我的聚类字段中过滤table_1

然后,当我查询类似:

SELECT shop, COUNT(id) count_id
FROM table_1
WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop)
GROUP BY shop

我得到了 8.9GB 的完整上限处理。

我的处理时间应该要少得多;table_1包含 10m 行商店名称,并且table_2仅包含 2m 行。

请注意,当我查询类似:

SELECT shop, COUNT(id) count_id
FROM table_1
WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop LIMIT 10000)
GROUP BY shop

我处理像230MB?

在第二个查询中;我将我的行限制为 10k,这似乎可行,但如果table_1包含 10m 行并table_1包含 2m 行,那么我已经将它缩小到最大 2m 行,对吧?

我的主要任务是:在不处理整个上限的情况下,我的集群字段可以扫描多少个阈值?

希望一切都有意义!如果没有,请告诉我,我会尝试重新解释。

谢谢你。

4

1 回答 1

1

区别就在这里:

WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop LIMIT 1000)

通常您不需要ORDER BY进行IN()操作 - 但是当您这样做时IN (ORDER BY x LIMIT y)- 那么您只会选择前 1000 家商店,所有商店的 id 都介于 - 比方说 -a和之间d

聚类已按shop- 对您的主表内容进行了排序,因此这IN只会打开包含a和之间的商店的聚类d。节约成本!

但如果你做了类似的事情:

WHERE shop IN('a','b','c','d',....,'z')

几乎不会节省任何成本,因为需要打开每个数据集群才能在所有这些集群中的任何一个集群中查找是否存在具有该名称的商店。

检查这 3 个查询之间的差异 - 并注意这DISTINCT也非常重要:

SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
  ('A', 'C', 'E', 'H', 'J', 'L', 'M', 'O', 'R', 'S') 
LIMIT 10

# 0.5 sec elapsed, 2.6 GB processed
SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
   (SELECT name FROM `fh-bigquery.weather_gsod.all` WHERE name BETWEEN 'A' AND 'C')
LIMIT 10

# 22.5 sec elapsed, 45.6 GB processed
SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
   (SELECT DISTINCT name FROM `fh-bigquery.weather_gsod.all` WHERE name BETWEEN 'A' AND 'C')
LIMIT 10

# 3.2 sec elapsed, 558.7 MB processed
于 2020-01-22T01:43:00.007 回答