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

BigQuery 与 ClickHouse Cloud: 等效与不同的概念

资源组织

ClickHouse Cloud 中资源的组织方式与 BigQuery 的资源层次结构 相似。我们在下面根据以下展示 ClickHouse Cloud 资源层次结构的图示描述具体差异:

NEEDS ALT

组织

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

BigQuery 项目与 ClickHouse Cloud 服务

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

  1. 一组计算节点(当前开发层服务为 2 个节点,生产层服务为 3 个节点)。对于这些节点,ClickHouse Cloud 支持垂直和水平扩展,可以手动或自动进行。
  2. 一个对象存储文件夹,该服务在此文件夹中存储所有数据。
  3. 一个端点(或通过 ClickHouse Cloud 界面控制台创建的多个端点)- 用于连接服务的服务 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 Data Types
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 不同的是,表的数据按主键列的值在磁盘上 有序存储。查询优化器利用这一排序顺序避免重新排序,以最小化连接时的内存使用,以及启用 limit 子句的短路处理。与 BigQuery 不同,ClickHouse 会基于主键列值自动创建 一个(稀疏)主索引。此索引用于加速所有包含主键列过滤器的查询。ClickHouse 当前不支持外键约束。

二级索引(仅在 ClickHouse 中可用)

除了基于表主键列值创建的主索引外,ClickHouse 允许您在其他列上创建二级索引。ClickHouse 提供几种类型的二级索引,每种索引适用于不同类型的查询:

  • 布隆过滤器索引
    • 用于加速具有等式条件的查询(例如,=, IN)。
    • 使用概率数据结构确定某个值是否存在于数据块中。
  • 令牌布隆过滤器索引
    • 类似于布隆过滤器索引,但用于标记化字符串,适合全文搜索查询。
  • 最小-最大索引
    • 为每个数据分区维护列的最小值和最大值。
    • 帮助跳过读取不在指定范围内的数据分区。

搜索索引

类似于在 BigQuery 中的 搜索索引,ClickHouse 可以为具有字符串值的列创建 全文索引

向量索引

BigQuery 最近推出了 向量索引 ,作为预发布功能。同样,ClickHouse 对于 加速向量搜索用例 也提供实验性支持。

分区

与 BigQuery 类似,ClickHouse 使用表分区来通过将表分割成更小、更易管理的部分来增强性能和可管理性。我们在 这里详细描述 ClickHouse 分区

聚类

在聚类过程中,BigQuery 根据几个指定列的值自动对表数据进行排序,并将其放置在最佳大小的块中。聚类提高了查询性能,使 BigQuery 更好地估计查询执行成本。通过聚类列,查询还可以消除对不必要数据的扫描。

在 ClickHouse 中,数据根据表的主键列 自动聚类存储在磁盘上,并在逻辑上组织成可以通过利用主索引数据结构快速定位或修剪的块。

物化视图

BigQuery 和 ClickHouse 都支持物化视图 - 基于转换查询结果与基础表的预计算结果,以提高性能和效率。

查询物化视图

BigQuery 物化视图可以直接查询或由优化器用于处理对基础表的查询。如果对基础表的更改可能使物化视图失效,则数据直接从基础表读取。如果对基础表的更改不会使物化视图失效,则其余数据将从物化视图中读取,只有更改部分从基础表中读取。

在 ClickHouse 中,物化视图只能直接查询。然而,与 BigQuery 相比(在 BigQuery 中,物化视图会在基础表更改后的 5 分钟内自动刷新,但不会更频繁地刷新 每 30 分钟),物化视图始终与基础表保持同步。

更新物化视图

BigQuery 定期通过针对基础表运行视图的转换查询来完全刷新物化视图。在刷新之间,BigQuery 将物化视图的数据与新基础表数据进行结合,以提供一致的查询结果,同时仍然使用物化视图。

在 ClickHouse 中,物化视图是增量更新的。这种增量更新机制提供了高可扩展性和低计算成本:增量更新的物化视图特别设计用于基础表包含数十亿或万亿行的场景。ClickHouse 并不需要多次查询不断增长的基础表来刷新物化视图,而是仅计算新插入基础表行值的部分结果。这一部分结果会在后台与之前计算的部分结果增量合并。这次刷新相比从整个基础表反复刷新物化视图大大降低了计算成本。

事务

与 ClickHouse 相比,BigQuery 支持在单个查询或在使用会话时跨多个查询的多语句事务。多语句事务使您能够对一个或多个表执行变更操作,如插入或删除行,并原子性地提交或回滚更改。 多语句事务在 ClickHouse 的 2024 年路线图中。

聚合函数

与 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 函数

ClickHouse

返回时间戳数组

BigQuery

GENERATE_TIMESTAMP_ARRAY 函数

ClickHouse

过滤数组

BigQuery

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

ClickHouse

arrayFilter 函数

压缩数组

BigQuery

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

ClickHouse

arrayZip 函数

聚合数组

BigQuery

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

ClickHouse

arraySumarrayAvg…函数,或将任何现有聚合函数名称作为参数传递给 arrayReduce 函数