【问题标题】:Partition pruning while selecting multiple computed partition values选择多个计算的分区值时进行分区修剪
【发布时间】:2021-03-23 10:40:45
【问题描述】:

我有一个按 3 字符 geohashes 的整数表示进行范围分区的表。我需要从这个表中选择多个分区,但是,在给我所需的分区之前,查询会读取整个表。

查询:

WITH
  hashes AS (
  SELECT
    ['ezw',
    'ezx',
    'ezy',
    'ezz'] AS hash_list)
SELECT
  *
FROM
  hashes,
  UNNEST(hashes.hash_list) AS hash_str,
  `project.dataset.partitioned_table`
WHERE
  geohash_num = ABS(MOD(farm_fingerprint(hash_str),4000))

三个字符的 geohash 在 hash_list 中,abs(mod(farm_fingerprint(geohash),4000)) 是我获取任何 geohash 字符串的数字表示 (

project.dataset.partitioned_tablegeohash_num 上进行分区,此列的数字从 1 到 4000。

我希望此查询仅获取与hash_list 中的地理哈希相对应的所需数字分区,这将对应于 961、1234、2684、3606,但它会在给我 4 个所需分区之前读取所有分区。

有人对如何让它只读取所需的分区而不是整个表有任何建议吗?

澄清:当我只有一个 geohash 时,此分区修剪有效,以下查询仅读取一个分区而不是整个表,即使 where 过滤器没有常量谓词:

WITH
  hashes AS (
  SELECT
    'ezw' AS hash_str)
SELECT
  *
FROM
  hashes,
  `freesolarcalc.Water_body_data.lake_geo33clustered_partitioned_dbscan`
WHERE
  geohash_num = ABS(MOD(farm_fingerprint(hash_str),4000))

当我必须过滤与多个分区值相对应的多个地理哈希时,就会出现问题。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    分区修剪works only with constant expressions。 您可以将 hash_str 选择为变量并像 SET my_hash_str = (SELECT ...) 一样使用它,然后使用 ... WHERE geohash_num = my_hash_str

    【讨论】:

    • 这是否意味着对于我的哈希列表,我需要为列表中的每个哈希创建一个不同的变量,分别过滤每个哈希,然后全部合并?
    • 是的。可能WHERE geohash_num IN (my_hash_str1, my_hash_str2, , my_hash_str3) 也可以。
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2012-04-17
    • 2020-01-28
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多