因此,基本上在运行子查询以从params表中获取日期参数之后,我将在包含数据的表上运行查询,并根据提供的过滤条件尝试降低查询成本。
不幸的是,BQ引擎无法降低查询成本(即使应用了过滤条件,它也会读取整个表)。有什么想法和变通方法吗?
下面是一个例子:
WITH date_range as (
SELECT
min(DATE_KEY) as min_date_key,
max(DATE_KEY) as max_date_key
FROM <TABLE_WITH_DATA_PARAMS>
)
SELECT * FROM <TABLE_WITH_DATA>
-- this filtering condition doesn't reduce the query costs
WHERE DATE_KEY between -- DATE_KEY is partitioned field
(SELECT min_date_key FROM date_range) and
(SELECT max_date_key FROM date_range)
发布于 2021-02-22 23:15:46
首先,通常,除非表是partitioned and/or clustered的,否则WHERE
子句不会减少扫描的数据量。我知道您的表确实是按字段DATE-KEY
进行分区的。
在这种情况下,如果我没有记错的话,问题出在动态表达式上。假设min_date_key
和max_date_key
的值是根据date_range
的值来设置的,这取决于<table_with_data_params>
(意味着动态分配),这使得BigQuery扫描所有分区。
请参阅this doc中的第二个示例,其中对此进行了解释。
此外,请注意,您应该避免将SELECT *
作为best practice来控制成本,除非这是不可避免的。
发布于 2021-02-23 00:30:57
下面给出了一些Bigquery成本optimization techniques:
BigQuery中的查询处理成本优化技术:
了解统一费率与按需定价
对于您的用例分区/集群,如果没有实现,您应该实现。
https://stackoverflow.com/questions/66316274
复制相似问题