我正在为多个客户使用一些历史性CRM数据。我将BigQuery架构安排为以下格式:
PARTITION_MONTH (DATE) | CLIENT_UUID (STR) | PDATE (Date) | ...
我通过截断PDATE
来使我的分区字段具有月份粒度,以补偿BQ当前的4k分区限制。另外,我将CLIENT_UUID
设置为一个群集字段,以加快特定于客户端的查询。我进行了一些基准测试,发现PARTITION_MONTH
对扫描多少字节没有影响。
我测试过的客户占表中记录的37%。我有三个表(相同的数据),其中有一个分区/集群,所有分区都设置为NULL的集群,没有分区/集群。聚簇表上的简单汇总表明CLIENT_UUID
聚簇正在工作:
SELECT SUM(amount) FROM dataset.table WHERE CLIENT_UUID='myclient'
Non-Partitioned: 513 MB processed
Clustered: 191 MB processed (~37% of non-partitioned)
Partitioned/Clustered: 191 MB processed
但是,当我将日期合并到查询中时,分区字段显示没有性能提升:
SELECT SUM(amount) FROM dataset.table
WHERE CLIENT_UUID='myclient'
AND [PARTITION_MONTH/PDATE] > DATE(2000, 1, 1)
Non-Partitioned: 513 MB processed
Clustered: 191 MB processed (~37% of non-partitioned)
Partitioned/Clustered: 191 MB processed
我假设在后台,BigQuery只会忽略指定日期之前的所有分区。但是,它似乎正在扫描客户端的所有行。
有人可以解释这种行为吗?是BigQuery还是我构建查询的方式的问题?谢谢您的帮助。