【发布时间】:2021-01-25 00:04:00
【问题描述】:
我在 BigQuery 数据库中设置了一个持久表(如果相关,使用 Looker)。该表有一个partition_key 和几个cluster_keys。我按时分区,然后根据我的主键(使用GENERATE_UUID 创建)以及用户将搜索的两个主要字段进行聚类。
然后我有一个 CTE 表,其余查询从中提取数据。此 CTE 选择持久表的子集(具有分区和集群键的表),但该表本身不是持久的,因此我认为我不能在其中包含分区和集群键。它看起来像这样:
WITH my_table_pre_exclusion AS (--
SELECT
*
FROM
`server.data.prefix_my_table_persist`
WHERE
(
( -- Some filter here
) -- AND ... some filter here
)
)
我的问题是:当我稍后执行涉及分区或集群键字段中的字段的大量连接时,从该表(预先应用一堆过滤器)中提取是否会损害性能?
跳过这个 CTE 表,直接从我所有下游连接中的持久表中提取,然后重新应用过滤器(适用于下游的所有内容)会不会更高效?这将是更多的代码膨胀,但我做了一些基准测试,我认为kkk这会损害性能,但我不确定。
是否有一种“两全其美”的方法,我不必对大量下游表应用相同的过滤器,但仍能获得最佳性能?也许在事后将 my_table_pre_exclusion 内部连接到所有下游表?
【问题讨论】:
标签: google-bigquery query-performance database-partitioning clustered-index