BigQuery – 在应用 WHERE shop IN (select shop from X) 时,聚集字段可以扫描的行数是否有限?
BigQuery – Is there a limited number of rows a clustered field can scan through when applying WHERE shop IN (select shop from X)?
举个例子:
说我拍了table_1
;按天对其进行分区并按 shop
对其进行聚类,我尝试使用 table_2
中的 shop
列表(非聚类或分区)从 [=13] 中的聚类字段进行过滤=].
然后,当我查询如下内容时:
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
包含 1000 万行商店名称,而 table_2
仅包含其中的 200 万行。
请注意,当我查询类似以下内容时:
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 行了吧?
我的主要问题是:在不处理整个上限的情况下,我的聚类字段可以扫描多少个是否有特定的阈值?
希望一切都有意义!!如果没有,请告诉我,我会尝试重新解释。
谢谢。
区别就在这里:
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
对您的主要 table 内容进行排序 - 因此此 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
举个例子:
说我拍了table_1
;按天对其进行分区并按 shop
对其进行聚类,我尝试使用 table_2
中的 shop
列表(非聚类或分区)从 [=13] 中的聚类字段进行过滤=].
然后,当我查询如下内容时:
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
包含 1000 万行商店名称,而 table_2
仅包含其中的 200 万行。
请注意,当我查询类似以下内容时:
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 行了吧?
我的主要问题是:在不处理整个上限的情况下,我的聚类字段可以扫描多少个是否有特定的阈值?
希望一切都有意义!!如果没有,请告诉我,我会尝试重新解释。
谢谢。
区别就在这里:
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
对您的主要 table 内容进行排序 - 因此此 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