BigQuery 与 ClickHouse Cloud:等价与不同概念
资源组织
ClickHouse Cloud 中的资源组织方式类似于 BigQuery 的资源层次结构。我们根据以下图示描述了 ClickHouse Cloud 资源层次结构的具体差异:

组织
与 BigQuery 类似,组织是 ClickHouse Cloud 资源层次结构中的根节点。您在 ClickHouse Cloud 账户中设置的第一个用户自动分配到用户拥有的组织。用户可以邀请其他用户加入该组织。
BigQuery 项目与 ClickHouse Cloud 服务
在组织内部,您可以创建服务,大致等同于 BigQuery 项目,因为 ClickHouse Cloud 中存储的数据与服务相关联。ClickHouse Cloud 中有 几种可用的服务类型。每个 ClickHouse Cloud 服务都部署在特定区域,并包括:
- 一组计算节点(当前,开发等级服务 2 个节点,生产等级服务 3 个节点)。对于这些节点,ClickHouse Cloud 支持垂直和水平扩展,包括手动和自动扩展。
- 一个对象存储文件夹,服务在其中存储所有数据。
- 一个端点(或通过 ClickHouse Cloud UI 控制台创建的多个端点) - 您用来连接到服务的服务 URL(例如,
https://dv2fzne24g.us-east-1.aws.clickhouse.cloud:8443
)
BigQuery 数据集与 ClickHouse Cloud 数据库
ClickHouse 会将表逻辑上组织成数据库。与 BigQuery 数据集类似,ClickHouse 数据库是组织和控制表数据访问的逻辑容器。
BigQuery 文件夹
ClickHouse Cloud 当前没有与 BigQuery 文件夹等效的概念。
BigQuery 插槽保留和配额
与 BigQuery 插槽保留类似,您可以在 ClickHouse Cloud 中 配置垂直和水平自动缩放。对于垂直自动扩展,您可以为服务的计算节点设置内存和 CPU 核心的最小和最大大小。服务将按照需要在这些范围内进行扩展。这些设置在初始服务创建流程中也可用。每个服务中的计算节点具有相同的大小。您可以通过 水平扩展 更改服务中的计算节点数量。
此外,类似于 BigQuery 配额,ClickHouse Cloud 提供并发控制、内存使用限制和 I/O 调度,允许用户将查询隔离到工作负载类中。通过为特定工作负载类设置共享资源的限制(CPU 核心、DRAM、磁盘和网络 I/O),确保这些查询不会影响其他关键业务查询。并发控制在并发查询数量较高的情况下防止线程溢出。
ClickHouse 跟踪服务器、用户和查询级别的内存分配字节大小,允许灵活的内存使用限制。内存超额分配使查询能够使用超出保证内存的额外空闲内存,同时确保其他查询的内存限制。此外,聚合、排序和连接子句的内存使用可以有限制,从而在超过内存限制时允许回退到外部算法。
最后,I/O 调度允许用户根据最大带宽、在途请求和策略限制工作负载类的本地和远程磁盘访问。
权限
ClickHouse Cloud 通过两个地方控制用户访问,即通过 云控制台 和通过数据库。控制台访问通过 clickhouse.cloud 用户界面进行管理。数据库访问通过数据库用户帐户和角色进行管理。此外,可以在数据库中授予控制台用户角色,使其能够通过我们的 SQL 控制台 与数据库进行交互。
数据类型
ClickHouse 在数值方面提供更细粒度的精度。例如,BigQuery 提供的数值类型有 INT64
,NUMERIC
,BIGNUMERIC
和 FLOAT64
。与此相比,ClickHouse 为小数、浮动数字和整数提供了多种精度类型。通过这些数据类型,ClickHouse 用户可以优化存储和内存开销,从而加快查询速度并降低资源消耗。以下是每种 BigQuery 类型对应的 ClickHouse 类型的映射:
在提供 ClickHouse 类型的多个选项时,请考虑数据的实际范围并选择最低要求。此外,考虑使用 适当的编解码器 以实现进一步的压缩。
查询加速技术
主键和外键以及主索引
在 BigQuery 中,表可以具有 主键和外键约束。通常,主键和外键用于关系数据库中确保数据完整性。主键值通常是每行唯一的,并且不是 NULL
。每行中的外键值必须出现在主键表的主键列中,或为 NULL
。在 BigQuery 中,这些约束不被强制执行,但查询优化器可以利用此信息来更好地优化查询。
在 ClickHouse 中,表也可以具有主键。与 BigQuery 类似,ClickHouse 不强制保证表的主键列值的唯一性。与 BigQuery 不同,表中的数据按主键列值 有序存储。查询优化器利用此排序来防止重新排序,最小化连接的内存使用,并使限制子句能够进行短路。与 BigQuery 不同,ClickHouse 会根据主键列值自动创建 一个 (稀疏) 主索引。该索引用于加速所有包含主键列过滤条件的查询。ClickHouse 当前不支持外键约束。
二级索引(仅在 ClickHouse 中可用)
除了根据表的主键列值创建的主索引外,ClickHouse 允许您在除主键外的其他列上创建二级索引。ClickHouse 提供几种类型的二级索引,每种都适用于不同类型的查询:
- 布隆过滤器索引:
- 用于加速具有相等条件的查询(例如,=,IN)。
- 使用概率数据结构确定值是否存在于数据块中。
- 令牌布隆过滤器索引:
- 类似于布隆过滤器索引,但用于令牌化字符串,适用于全文搜索查询。
- 最小-最大索引:
- 维护数据部分中每列的最小值和最大值。
- 有助于跳过读取不在指定范围内的数据部分。
搜索索引
与 BigQuery 中的 搜索索引 类似,ClickHouse 表可以在具有字符串值的列上创建 全文索引。
向量索引
BigQuery 最近推出了 向量索引 作为预 GA 特性。同样,ClickHouse 实验性支持 加速向量搜索 用例的索引。
分区
与 BigQuery 类似,ClickHouse 使用表分区来通过将表划分为更小、更易管理的部分(称为分区)来提高大表的性能和可管理性。我们在 此处 详细描述了 ClickHouse 的分区。
聚类
通过聚类,BigQuery 自动根据几个指定列的值对表数据进行排序,并将其置于优化大小的块中。聚类提高了查询性能,使 BigQuery 能够更好地估算运行查询的成本。使用聚类列,查询还消除了对不必要数据的扫描。
在 ClickHouse 中,数据会根据表的主键列 自动进行聚类,并逻辑上组织在可以通过利用主索引数据结构快速定位或修剪的块中。
物化视图
BigQuery 和 ClickHouse 都支持物化视图——基于变换查询结果针对基表的预计算结果,以提高性能和效率。
查询物化视图
BigQuery 物化视图可以直接查询或由优化器使用以处理对基表的查询。如果对基表的更改可能使物化视图无效,则直接从基表读取数据。如果对基表的更改不使物化视图无效,则其他数据从物化视图中读取,只有更改从基表读取。
在 ClickHouse 中,物化视图只能直接查询。然而,与 BigQuery(其物化视图会在基表更改后的 5 分钟内自动刷新,但不会超过 每 30 分钟一次)相比,物化视图始终与基表保持同步。
更新物化视图
BigQuery 通过对基表运行视图的变换查询来定期完全刷新物化视图。在刷新之间,BigQuery 将物化视图的数据与新基表数据结合,以提供一致的查询结果,同时仍然使用物化视图。
在 ClickHouse 中,物化视图是增量更新的。这种增量更新机制提供了高可扩展性和低计算成本:增量更新的物化视图专为基表包含数十亿或数万亿行的场景而设计。ClickHouse 不再重复查询逐渐增长的基表以刷新物化视图,而是简单地仅从新插入的基表行的值计算部分结果。这个部分结果在后台与先前计算的部分结果增量合并。与从整个基表重复刷新物化视图相比,这显著降低了计算成本。
事务
与 ClickHouse 相对,BigQuery 支持在单个查询内部或使用会话跨多个查询进行多语句事务。多语句事务允许您对一个或多个表执行变更操作,例如插入或删除行,并以原子方式提交或回滚更改。多语句事务是 ClickHouse 2024 年的路线图的一部分。
聚合函数
与 BigQuery 相比,ClickHouse 提供了显著更多的内置聚合函数:
- BigQuery 提供 18 种聚合函数,和 4 种近似聚合函数。
- ClickHouse 具有超过 150 种预构建的聚合函数,以及强大的 聚合组合器,用于 扩展 预构建聚合函数的行为。例如,您可以通过将 -Array 后缀 传递给聚合函数,直接对数组而不是表行应用 150 多个预构建聚合函数。使用 -Map 后缀,您可以对映射应用任何聚合函数。使用 -ForEach 后缀,您可以对嵌套数组应用任何聚合函数。
数据源和文件格式
与 BigQuery 相比,ClickHouse 支持显著更多的文件格式和数据源:
- ClickHouse 原生支持从几乎任何数据源加载 90 多种文件格式
- BigQuery 支持 5 种文件格式和 19 种数据源
SQL 语言特性
ClickHouse 提供标准 SQL 并具有许多扩展和改进,使其更适合分析任务。例如,ClickHouse SQL 支持 lambda 函数 和高阶函数,因此在应用变换时您不必展开数组。这是相对于其他系统(如 BigQuery)的一个重大优势。
数组
与 BigQuery 的 8 个数组函数相比,ClickHouse 拥有超过 80 个 内置数组函数,可以优雅且简单地建模和解决广泛的问题。
ClickHouse 中一个典型的设计模式是使用 groupArray
聚合函数将表的特定行值(暂时)转换为数组。然后可以方便地通过数组函数处理,并且结果可以通过 arrayJoin
聚合函数转换回单独的表行。
由于 ClickHouse SQL 支持 高阶 lambda 函数,许多高级数组操作可以通过简单调用一个高阶内置数组函数来实现,而不需要像在 BigQuery 中那样暂时将数组转换回表(通常是 需要的),例如 筛选 或 压缩 数组。在 ClickHouse 中,这些操作只是高阶函数 arrayFilter
和 arrayZip
的简单函数调用。
以下是 BigQuery 到 ClickHouse 的数组操作映射:
BigQuery | ClickHouse |
---|---|
ARRAY_CONCAT | arrayConcat |
ARRAY_LENGTH | length |
ARRAY_REVERSE | arrayReverse |
ARRAY_TO_STRING | arrayStringConcat |
GENERATE_ARRAY | range |
为子查询中的每行创建一个包含一个元素的数组
BigQuery
ClickHouse
groupArray 聚合函数
将数组转换为一组行
BigQuery
UNNEST
操作符
ClickHouse
ARRAY JOIN 子句
返回一个日期数组
BigQuery
ClickHouse
返回一个时间戳数组
BigQuery
ClickHouse
过滤数组
BigQuery
需要通过 UNNEST
操作符暂时将数组转换回表
ClickHouse
arrayFilter 函数
压缩数组
BigQuery
需要通过 UNNEST
操作符暂时将数组转换回表
ClickHouse
arrayZip 函数
聚合数组
BigQuery
需要通过 UNNEST
操作符将数组转换回表
ClickHouse
arraySum、arrayAvg 等函数,或者将 arrayReduce 函数作为参数的任何已存在的 90 多个聚合函数名称