sql - 使用 CREATE TABLE 在 BigQuery 中进行集群
问题描述
不确定我是否正确集群。基本上,我正在查看 50 个客户的 GCP 计费信息。每个客户端都有一个 Billing_ID,我在该 billing_ID 上进行集群。我将聚簇表用于数据工作室仪表板
请参阅下面的 SQL 查询以了解我现在在做什么
CREATE OR REPLACE TABLE `dashboardgcp`
PARTITION BY DATE(usage_start_time)
CLUSTER BY billing_account_id
AS
SELECT
*
FROM
`datagcp`
WHERE
usage_start_time BETWEEN TIMESTAMP('2019-01-01')
AND TIMESTAMP(CURRENT_DATE)
像这样成功集群,我只是没有明显的查询性能提升!
解决方案
所以我想通过将它与 billing_ID 进行聚类,我应该会看到仪表板性能有所提高
请考虑以下几点:
集群结构
集群字段由字段数组组成,如框,从外到内,作为 BigQuery链接中的状态
当您使用多列对表进行聚类时,您指定的列顺序很重要。指定列的顺序决定了数据的排序顺序。
这意味着正如@Gordon 所写,在您的查询中,该WHERE
部分需要从外部字段开始到内部字段,以充分利用您的集群字段。在您的情况下,如果userId是WHERE
您需要更改集群字段以匹配此的一部分
集群限制
集群通常更适合扫描超过 1GB 数据的查询,因此如果您不扫描此数据量,您将看不到您正在寻找的改进
带有摄取表的集群
假设您的 dara 不是静态的,并且您不断将数据添加到表datagcp中,您需要注意集群索引是 BigQuery 对插入操作离线执行的一个过程,而对分区是一个单独的过程。
副作用是您的集群会随着时间的推移而“减弱”。要解决这个问题,您需要使用merge
命令重新构建集群,以便充分利用集群
从文档:
“随着时间的推移,随着越来越多的操作修改表,数据的排序程度开始减弱,表变成部分排序”。
推荐阅读
- windows - 如何在 Windows 命令提示符或批处理脚本中使用包含表情符号的文件名
- mysql - 当我调用一个应该调用我知道存在的数据的过程时,我总是得到零
- rust - 如何将 enum_dispatch 的 try_into() 与 Mutex 一起使用?
- f# - 如何在 F# 中编写带参数的委托?
- reactjs - SetInterval 导致将状态变量更新为反应中的默认值
- c - 在 C 程序中在一行中调用 system() 两次
- python - 有没有直接的方法来裁剪图像中背景区域应该透明的不规则尺寸/非矩形对象
- android - 我的 Android 应用无法在后台运行
- javascript - 如何在javascript中的任何条件下制作字符串搜索功能?
- apk - gomobile build,Paho mqtt 客户端无法连接到 APK 中的 mqtt 代理