来自 https://cloud.google.com/bigquery/docs/partitioned-tables:
您可以使用基于时间的命名方法(例如[PREFIX] _YYYYMMDD
)来分片表这使我能够做到:
SELECT count(*) FROM `xxx.xxx.xxx_*`
并查询所有分片。是否有仅查询最新分片的特殊符号?例如说我有:
我可以照做
SELECT count(*) FROM `xxx.xxx.xxx_{{ latest }}`
查询xxx_20180801吗?
Mikhail Berlyant启发的单查询:
SELECT count(*) as c FROM `XXX.PREFIX_*` WHERE _TABLE_SUFFIX IN ( SELECT
SUBSTR(MAX(table_id), LENGTH('PREFIX_') + 2)
FROM
`XXX.__TABLES_SUMMARY__`
WHERE
table_id LIKE 'PREFIX_%')
答案 0 :(得分:3)
如果您确实关心成本(意味着查询将扫描多少张表),那么唯一的方法是分两个步骤进行操作
第一个查询
#standardSQL
SELECT SUBSTR(MAX(table_id), LENGTH('PREFIX') + 1)
FROM `xxx.xxx.__TABLES_SUMMARY__`
WHERE table_id LIKE 'PREFIX%'
第二次查询
#standardSQL
SELECT COUNT(*)
FROM `xxx.xxx.PREFIX_*`
WHERE _TABLE_SUFFIX = '<result of first query>'
因此,如果第一个查询的结果为20180801
,那么第二个查询显然将如下所示
#standardSQL
SELECT COUNT(*)
FROM `xxx.xxx.PREFIX_*`
WHERE _TABLE_SUFFIX = '20180801'
如果您不在乎成本,而只需要结果-您可以轻松地将上述两个查询合并为一个-但是-再一次-请记住-即使结果不在最后一个表中-成本将取决于您查询所有与xxx.xxx.PREFIX_*
忘了提及(尽管应该很明显):当然,当您的COUNT(1)
中只有SELECT
时,两个选项的成本均为0(零),但实际上-您很有可能会拥有比count(1)更有价值的东西