如何在大查询中在现有表上创建分区和集群?

Posted

技术标签:

【中文标题】如何在大查询中在现有表上创建分区和集群?【英文标题】:how to create partition and cluster on an existing table in big query? 【发布时间】:2021-09-28 02:34:56 【问题描述】:

在 SQL Server 中,我们可以这样创建索引。表已经存在后如何创建索引? bigquery中创建聚集索引的语法是什么?

CREATE INDEX abcd ON `abcd.xxx.xxx`(columnname )

在大查询中,我们可以创建如下表。但是如何在现有表上创建分区和集群?

CREATE TABLE rep_sales.orders_tmp PARTITION BY DATE(created_at) CLUSTER BY created_at AS SELECT * FROM rep_sales.orders

【问题讨论】:

BigQuery 没有索引 - 检查this out 这能回答你的问题吗? Indexes on BigQuery Table CREATE TABLE rep_sales.orders_tmp PARTITION BY DATE(created_at) CLUSTER BY created_at AS SELECT * FROM rep_sales.orders 貌似有分区和集群。但是如何在现有表上创建分区和集群? 【参考方案1】:

正如 @Sergey Geron 在 cmets 中提到的,BigQuery 不支持索引。更多信息请参考这个doc。

现有表无法分区,但您可以创建一个新的分区表,然后将数据从未分区表加载到其中。

对于表的集群,BigQuery 支持将现有的非集群表更改为集群表,反之亦然。您还可以更新聚簇表的聚簇列集。这种更新聚簇列集的方法对于使用连续流式插入的表很有用,因为这些表不能轻易地被其他方法交换。

您可以通过以下方式change the clustering specification:

调用tables.updatetables.patch API 方法。

使用--clustering_fields 标志调用bq 命令行工具的bq update 命令。

注意:当表从非聚簇转换为聚簇或聚簇列集更改时,自动重新聚簇仅从那时起有效。例如,使用 tables.update 转换为聚簇表的非聚簇 1 PB 表仍然具有 1 PB 的非聚簇数据。自动重新聚类仅适用于更新后提交到表的任何新数据。

【讨论】:

以上是关于如何在大查询中在现有表上创建分区和集群?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询在大表上很慢

具有集群和分区的表上的 Bigquery SQL 性能问题

如何在大表上优化这个 mysql 连接?

将表上的现有条目转换为Hibernate实体对象

是否可以选择在雪花表上强制分区

如何使用 Go 在大查询中获取表列名列表