如何修复 BigQuery 中缓慢的 _TABLE_SUFFIX 查询?

Posted

技术标签:

【中文标题】如何修复 BigQuery 中缓慢的 _TABLE_SUFFIX 查询?【英文标题】:How to fix slow _TABLE_SUFFIX queries in BigQuery? 【发布时间】:2019-07-15 15:42:27 【问题描述】:

这个 _TABLE_SUFFIX 查询耗时 2.5 秒

SELECT COUNT(1)
FROM `projectid.datasetid.hospital_*` 

如果我们添加这个 WHERE 语句:

WHERE _TABLE_SUFFIX LIKE '_2_' OR _TABLE_SUFFIX LIKE '_1_' 

...查询需要 8 分 19 秒

第一个查询匹配的只有三个表。这很令人担忧,因为我们正在研究针对数千个表的查询和过滤。

为什么 _TABLE_SUFFIX 查询如此缓慢,如何才能更快地执行它们,尤其是使用 REGEX 类型的操作?

【问题讨论】:

如果使用 BETWEEN 或 IN 会怎样?你看到同样的表现吗? 发生了一次还是多次?无法重现。请针对此类问题发布工作 ID。 【参考方案1】:

如果'_1_'/'_2_' 中的下划线只能是数字,我只能建议尝试这样的事情:

select sum(cnt) from (

SELECT COUNT(*) as cnt
FROM `projectid.datasetid.hospital_0*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_1*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_2*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_3*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_4*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_5*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_6*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_7*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_8*`
WHERE _TABLE_SUFFIX between '10' and '29'
union all
SELECT COUNT(*)
FROM `projectid.datasetid.hospital_9*`
WHERE _TABLE_SUFFIX between '10' and '29'

)

【讨论】:

以上是关于如何修复 BigQuery 中缓慢的 _TABLE_SUFFIX 查询?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 脚本中的条件逻辑

如何将查询结果插入 BigQuery 前缀表

在 BigQuery 中创建 UDF

如何在 google bigquery 数据集中创建动态表并在 tableau 中访问?

在 BigQuery 中滚动 7 天

Bigquery 去特征化