如何修复 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章