跳到主要内容
跳到主要内容

BigQuery 与 ClickHouse Cloud:相同和不同的概念

资源组织

ClickHouse Cloud 中资源的组织方式类似于 BigQuery的资源层次结构。我们根据下方显示的 ClickHouse Cloud 资源层次结构图描述具体的差异:

组织

与 BigQuery 类似,组织是 ClickHouse Cloud 资源层次结构中的根节点。您在 ClickHouse Cloud 帐户中设置的第一个用户将自动分配到由用户拥有的组织。该用户可以邀请其他用户加入组织。

BigQuery 项目与 ClickHouse Cloud 服务

在组织内,您可以创建与 BigQuery 项目大致相当的服务,因为 ClickHouse Cloud 中存储的数据与服务相关联。在 ClickHouse Cloud 中有 几种可用的服务类型。每个 ClickHouse Cloud 服务部署在特定区域,并包括:

  1. 一组计算节点(目前,开发级服务为 2 个节点,生产级服务为 3 个节点)。对于这些节点,ClickHouse Cloud 支持垂直和水平扩展,包括手动和自动扩展。
  2. 一个对象存储文件夹,服务在其中存储所有数据。
  3. 一个端点(或通过 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, BIGNUMERICFLOAT64。将这些与 ClickHouse 进行对比,后者为十进制、浮点数和整数提供了多种精度类型。利用这些数据类型,ClickHouse 用户可以优化存储和内存开销,从而提高查询速度并降低资源消耗。以下是每个 BigQuery 类型对应的 ClickHouse 类型:

BigQueryClickHouse
ARRAYArray(t)
NUMERICDecimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S)
BIG NUMERICDecimal256(S)
BOOLBool
BYTESFixedString
DATEDate32 (范围更窄)
DATETIMEDateTime, DateTime64 (范围窄,精度更高)
FLOAT64Float64
GEOGRAPHYGeo 数据类型
INT64UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256
INTERVALNA - 作为表达式支持通过函数
JSONJSON
STRINGString (bytes)
STRUCTTuple, Nested
TIMEDateTime64
TIMESTAMPDateTime64

在面对 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 年的 roadmap

聚合函数

与 BigQuery 相比,ClickHouse 提供显著更多内置聚合函数:

数据源和文件格式

与 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 中,这些操作只是高阶函数 arrayFilterarrayZip 的简单函数调用。

接下来,我们提供 BigQuery 到 ClickHouse 数组操作的映射:

BigQueryClickHouse
ARRAY_CONCATarrayConcat
ARRAY_LENGTHlength
ARRAY_REVERSEarrayReverse
ARRAY_TO_STRINGarrayStringConcat
GENERATE_ARRAYrange

为子查询中的每一行创建一个元素的数组

BigQuery

ARRAY 函数

ClickHouse

groupArray 聚合函数

将数组转换为一组行

BigQuery

UNNEST 操作符

ClickHouse

ARRAY JOIN 子句

返回日期数组

BigQuery

GENERATE_DATE_ARRAY 函数

range + arrayMap 函数

ClickHouse

返回时间戳数组

BigQuery

GENERATE_TIMESTAMP_ARRAY 函数

ClickHouse

range + arrayMap 函数

过滤数组

BigQuery

需要通过 UNNEST 操作符临时将数组转换回表

ClickHouse

arrayFilter 函数

压缩数组

BigQuery

需要通过 UNNEST 操作符临时将数组转换回表

ClickHouse

arrayZip 函数

聚合数组

BigQuery

要求通过 UNNEST 操作符将数组转换回表

ClickHouse

arraySum, arrayAvg, ... 函数,或任何现有的 90 多种聚合函数名称作为 arrayReduce 函数的参数