【问题标题】:Propagation of BigQuery parition/cluster keys to a CTE table - Performance将 BigQuery 分区/集群键传播到 CTE 表 - 性能
【发布时间】: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


    【解决方案1】:

    发布我自己的答案,尽管我很乐意让其他人详细说明,因为我只能找到非常稀疏的文档。

    我从一位乐于助人的 BigQuery 专家那里获得了一些信息:我要问的是一种叫做“谓词下推”的东西,BigQuery 最近增加了对它的支持。

    我仍在尝试了解支持的详细信息,但这似乎并不是 BigQuery 独有的(尽管我确信它的优化器在整体性能中发挥着重要作用)。你可以在这里阅读一点:https://modern-sql.com/feature/with/performance#predicate-pushdown

    底线是 如果 BigQuery 的支持足以满足我正在运行的查询,那么 queries-on-subqueries 将使用分区/集群有效地执行键。无论如何,我从初始版本中阅读了一些文档,说它可能只适用于基于日期的分区键,但也许它已经扩展了支持。 “

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2020-09-27
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多