优化存储以提高性能¶
本主题讨论可以提高查询性能的存储优化,例如将类似数据存储在一起、创建优化的数据结构以及定义专门的数据集。Snowflake 提供三种此类存储策略:自动聚类、搜索优化和物化视图。
通常,这些存储策略并不能实质性地提高已经可在一秒钟或更短的时间内执行的查询的性能。
本主题讨论的策略只是提高查询性能的一种方法。有关与用于执行查询的计算资源相关的策略,请参阅 优化仓库以提高性能。
存储策略简介¶
自动聚类¶
Snowflake 将表的数据存储在 微分区 中。在这些微分区中,Snowflake 根据数据维度整理(即聚类)数据。如果查询沿着这些维度过滤、联接或汇总,则扫描更少的微分区就能返回结果,从而大大加快查询速度。
您可以设置 聚类键 来更改微分区的默认组织方式,以便数据围绕特定维度(即列)聚类。选择聚类键可以提高按聚类键中定义的列过滤、联接或聚合的查询的性能。
定义聚类键后,Snowflake 会启用自动聚类以维护表的聚类。启用后,自动聚类会在向表中添加新数据时更新微分区。了解详情
搜索优化服务¶
搜索优化服务提高了点查找查询(即“大海捞针搜索”)的性能,这些查询使用高选择性筛选器减少从表中返回的行。当非常需要低延迟的点查找查询(例如调查日志搜索、威胁或异常检测以及带有选择性筛选器的关键仪表板)时,搜索优化服务是理想之选。
搜索优化服务通过构建针对特定搜索类型进行优化的持久数据结构来减少点查找查询的延迟。
您可以为整个表或特定列启用搜索优化服务。只要它们具有足够的选择性,就可以显著加快针对这些列进行 等效搜索、 子字符串搜索 的速度。
搜索优化服务支持结构化和半结构化数据(请参阅 支持的数据类型)。
搜索优化服务需要 Snowflake Enterprise Edition 或更高版本。了解详情
物化视图¶
物化视图是从 SELECT 语句派生的预先计算的数据集,系统会存储该语句供以后使用。相较于对定义视图的基表执行查询,查询物化视图会更快,因为数据是经过预先计算的。例如,如果您在创建物化视图时指定 SELECT SUM(column1)
,则从视图返回 SUM(column1)
的查询执行速度会更快,因为 column1
已经进行了聚合。
物化视图旨在提高以下工作负载的查询性能:这些工作负载由常见的重复查询模式组成,这些模式相对于基表返回少量行和/或列。
物化视图不能基于多个表。
物化视图需要 Snowflake Enterprise Edition 或更高版本。了解详情
选择优化策略¶
不同类型的查询可受益于不同的存储策略。您可以通过以下部分了解哪种策略最适合某个工作负载。
自动聚类是最广泛的选项,它可以使访问表中相同列的一系列查询受益。管理员通常根据频率和延迟要求选择最重要的查询,然后选择可最大限度地提高这些查询性能的聚类键。当许多查询过滤、联接或聚合相同的几列时,自动聚类才有意义。
搜索优化服务和物化视图的范围较窄。当特定查询访问表中明确定义的数据子集时,管理员可以使用查询的特征来决定使用搜索优化服务还是物化视图可以提高性能。例如,管理员可以识别重要的点查找查询并为表或列实施搜索优化服务。同样,管理员可以通过创建物化视图来优化特定查询模式。
您可以为一个表实施多种策略,并且具有多个筛选条件的单个查询可能会受益于自动聚类和搜索优化服务。但是,启用搜索优化服务或基于聚类表创建物化视图代价可能会更高昂。 要了解这会增加计算成本的原因,请参阅 持续成本 (本主题内容)。
如果有多种策略有可能提高特定查询的性能,则可能需要从自动聚类或搜索优化服务入手,因为其他具有类似访问模式的查询也可以得到改进。
区分注意事项¶
以下内容并不是对存储策略的详尽比较,而是说明了区分它们时要考虑的最重要事项。
- 自动聚类:
最大的性能提升来自对聚类键列进行筛选的 WHERE 子句,但它也可以提高作用于同一列的其他子句和函数(例如联接和聚合)的性能。
非常适合范围查询或具有不等效筛选器的查询。还可以改进等效筛选器,但是搜索优化服务通常更快地进行点查找查询。
在 Snowflake 的 Standard Edition 中可用。
只能有一个聚类键。[1] 如果针对表的不同查询作用于不同的列,请考虑改用搜索优化服务或物化视图。
- 搜索优化服务:
改进了返回 少量行 的点查找查询。如果查询返回多条记录,不妨考虑自动聚类。
包括对符合以下条件的点查找查询的支持:
匹配使用 LIKE 和 RLIKE 等谓词的子字符串或正则表达式。
在 VARIANT、 ARRAY、或 OBJECT 列中搜索特定字段。
使用带有 GEOGRAPHY 值的地理空间函数。
- 物化视图:
改进了密集和频繁的计算,例如聚合和分析半结构化数据(而不仅仅是筛选)。
通常侧重于特定查询/子查询计算。
改进了对 外部表 的查询。
[1] 如果定义多个聚类键有重要意义,则可以创建多个物化视图,每个视图都有自己的聚类键。
原型查询¶
以下示例旨在重点介绍哪种类型的查询通常在搭配使用特定存储策略时运行更快。
- 适用于聚类的原型查询
自动聚类提升了涵盖大型表扫描的 范围查询 的性能。例如,如果
shipdate
列是表的聚类键,则以下查询的执行速度会更快,因为WHERE
子句会扫描大量数据。SELECT SUM(quantity) AS sum_qty, SUM(extendedprice) AS sum_base_price, AVG(quantity) AS avg_qty, AVG(extendedprice) AS avg_price, COUNT(*) AS count_order FROM lineitem WHERE shipdate >= DATEADD(day, -90, to_date('2023-01-01));
有关在表聚类时可能会提高运行速度的查询的另一个示例,请参阅 定义群集密钥的优势(适用于超大型表)。
- 适用于搜索优化的原型查询
搜索优化服务可以提高 点查找查询 的性能,这些查询会扫描大型表以返回一小部分记录。例如,如果
sender_ip
列有大量不同的值,则使用搜索优化服务可以更快地执行以下查询。SELECT error_message, receiver_ip FROM logs WHERE sender_ip IN ('198.2.2.1', '198.2.2.2');
要查看搭配使用搜索优化服务可能运行更快的其他查询,请参阅以下示例:
- 适用于物化视图的原型查询
物化视图可以提升使用聚合等成本高昂的运算访问一小部分数据的查询的性能。例如,假设管理员在创建物化视图
mv_view1
时聚合了totalprice
列。以下针对物化视图的查询将比针对基表的查询执行速度更快。SELECT orderdate, SUM(totalprice) FROM mv_view1 GROUP BY 1;
有关物化视图可以加快查询速度的更多用例,请参阅 物化视图的用例示例。
实施和成本注意事项¶
本节讨论在使用存储策略提高查询性能时的成本注意事项,以及平衡成本和性能时的实施注意事项。
初始投资¶
与其他类型的性能优化(例如重写 SQL 语句或 优化运行查询的仓库 )相比,实施存储策略可能需要更大的时间投入和前期财务投入,但性能改进可能会非常显著。
Snowflake 使用 无服务器计算资源 来实施每种存储策略,在测试优化提高性能的程度之前,这会消耗 credit。此外,Snowflake 可能需要大量时间才能完全实施自动聚类和搜索优化服务(例如,一个非常大的表需要一周的时间)。
搜索优化服务和物化视图还需要 Enterprise Edition 或更高版本,这会提高 credit 的价格。
持续成本¶
存储策略会产生计算和存储成本。
- 计算成本
当向表中添加新数据时,Snowflake 使用无服务器计算资源来持续进行存储优化。对表做出的更改越多,维护成本越高。如果表不断更新,维护存储优化的成本可能会高得令人望而却步。
当为基础表启用自动聚类时,维护物化视图或搜索优化服务的成本可能会很高。借助自动聚类,Snowflake 不断围绕聚类键的维度重新聚类其微分区。每次重新聚类基表时,Snowflake 都必须使用无服务器计算资源来更新物化视图和搜索优化服务使用的存储空间。因此,除了基表的 DML 命令成本外,基表的自动聚类活动还会触发物化视图和搜索优化服务的维护成本。
- 存储成本
- 自动聚类
与搜索优化服务和物化视图不同,自动聚类会重新整理现有数据,而不是创建额外的存储空间。但是,如果重聚类增加 故障安全 存储的大小,则会产生额外的存储成本。有关详细信息,请参阅 重聚类对 credit 和存储的影响。
- 搜索优化/物化视图
物化视图和搜索优化服务会产生额外存储成本,按标准费率计费。
估算成本¶
- 搜索优化服务
您可以运行 SYSTEM$ESTIMATE_SEARCH_OPTIMIZATION_COSTS 函数来帮助估算将搜索优化服务添加到列或整个表的成本。估算成本与将要启用的列数以及该表最近进行的更改成正比。
实施策略¶
由于存储策略的计算成本和存储成本可能很高,因此在进行更广泛的实施之前,您可能需要从小规模开始,仔细跟踪初始和持续成本。例如,您可以只为一两个表选择聚类键并评估成本,然后再为其他表选择键。
在跟踪与存储策略相关的持续成本时,请记住,虚拟仓库仅在运行查询期间消耗 credit,因此查询运行速度越快,成本越低。Snowflake 建议在存储优化之前仔细报告运行查询的成本,并将其与存储优化后运行相同查询的成本进行比较,以便将其纳入成本评估。