搜索优化服务¶
搜索优化服务可以显著提高某些类型的查找和分析查询的性能。该服务支持广泛的筛选谓词(请参阅 识别可从搜索优化中受益的查询)。
备注
要从比较使用和不使用搜索优化的执行时间的教程入手,请参阅 搜索优化入门 (https://quickstarts.snowflake.com/guide/getting_started_with_search_optimization/index.html)。
搜索优化服务旨在显著提高表上某些类型的查询的性能,包括:
对表进行选择性点查找查询。点查找查询仅会返回一个或少量不同的行。用例示例包括:
需要快速响应具有高度选择筛选器的关键仪表板的业务用户。
正在探索大量数据并寻找特定数据子集的数据科学家。
根据一组广泛的筛选谓词检索一小部分结果的数据应用程序。
有关更多信息,请参阅 通过搜索优化加速点查找查询。
子字符串和正则表达式搜索(例如 [ NOT ] LIKE、 [ NOT ] ILIKE、 [ NOT ] RLIKE 等)。有关更多信息,请参阅 通过搜索优化加快子字符串和正则表达式查询。
对使用以下谓词类型的 VARIANT、 OBJECT 和 ARRAY (半结构化)列中的字段的查询:
相等谓词。
IN 谓词。
使用 ARRAY_CONTAINS 的谓词。
使用 ARRAYS_OVERLAP 的谓词。
子字符串和正则表达式谓词。
检查 NULL 值的谓词。
有关更多信息,请参阅 通过搜索优化加快半结构化数据的查询速度。
使用拥有 GEOGRAPHY 值的选定地理空间函数的查询。有关更多信息,请参阅 通过搜索优化加速地理空间查询。
确定可以从搜索优化服务中受益的查询后,可以为这些查询中使用的列和表 启用搜索优化。
搜索优化服务通常对用户公开透明。查询的工作方式与未使用搜索优化时相同;只是有些查询速度更快。但是,搜索优化确实会对某些其他表操作产生影响。有关更多信息,请参阅 使用搜索优化表。
搜索优化服务的工作原理¶
为了提高搜索查询的性能,搜索优化服务会创建并维护称为 搜索访问路径 的持久性数据结构。搜索访问路径可跟踪在每个 微分区 中可能找到的表列值,这样在扫描表时就可以跳过某些微分区。
维护服务负责创建和维护搜索访问路径:
启用搜索优化后,维护服务会创建搜索访问路径,并使用执行查找所需的数据填充搜索访问路径。
构建搜索访问路径可能需要花费大量时间,具体取决于表的大小。维护服务在后台运行,不会阻止对表的任何操作。在完全构建搜索访问路径之前,不会加速查询。
更新表中的数据时(例如,通过加载新数据集或通过 DML 操作),维护服务会自动更新搜索访问路径,以反映对数据的更改。
如果在搜索访问路径仍在更新时运行查询,则查询运行速度可能会变慢,但仍会返回正确的结果。
每个表的维护服务的进度会在 SHOW TABLES 输出的 search_optimization_progress
列中显示。在衡量新优化的表的搜索优化性能改进情况之前,请确保此列显示该表已完全优化。
搜索访问路径维护公开透明。无需创建虚拟仓库,即可运行维护服务。但是,维护的存储和计算资源是有成本的。有关成本的更多详细信息,请参阅 搜索优化成本估算和管理。
用于优化查询性能的其他选项¶
搜索优化服务是优化查询性能的几种方法之一。其他技术包括:
查询加速。
对表进行聚类。
创建一个或多个物化视图(聚类或非聚类)。
如下表所示,每种技术都有不同的优势:
功能 |
支持的查询类型 |
备注 |
---|---|---|
搜索优化服务 |
搜索优化服务可以提高对 受支持数据类型 的搜索性能。 |
|
带有筛选器或聚合功能的查询。如果查询包括 LIMIT,则查询还必须包括 ORDER BY。
筛选器必须具有高度选择性,并且 ORDER BY 子句必须具有低基数。
查询加速适用于临时分析、数据量不可预测的查询,
以及具有大型扫描和选择性筛选器的查询。
|
查询加速和搜索优化是相辅相成的。两者都可以加速同一查询。请参阅 与查询加速的兼容性。 |
|
|
您还可以使用物化视图在同一源表(或该表的子集)上定义不同的聚类密钥,或者存储展平 JSON 或变体数据,以便只需展平一次。 物化视图仅可提高物化视图中包含的行和列子集的性能。 |
|
|
一个表只能根据一个密钥进行聚类,该密钥可以包含一个或多个列或表达式。 |
下表显示了哪些优化会产生存储或计算成本:
存储成本 |
计算成本 |
|
---|---|---|
搜索优化服务 |
✔ |
✔ |
Query Acceleration Service |
✔ |
|
物化视图 |
✔ |
✔ |
对表进行聚类 |
✔ [1] |
✔ |
与查询加速的兼容性¶
搜索优化和 查询加速 可以协同工作以优化查询性能。首先,搜索优化可以剪切查询不需要的 微分区。然后,对于 符合条件的查询,Query Acceleration 可以将其余部分工作分流到服务提供的共享计算资源。
这两种服务所加速的查询性能因工作负载和可用资源而异。
示例¶
首先,创建一个包含数据的表:
create or replace table test_table (id int, c1 int, c2 string, c3 date) as
select * from values
(1, 3, '4', '1985-05-11'),
(2, 4, '3', '1996-12-20'),
(3, 2, '1', '1974-02-03'),
(4, 1, '2', '2004-03-09'),
(5, null, null, null);
将 SEARCH OPTIMIZATION 属性添加到表中:
alter table test_table add search optimization;
以下查询可以使用搜索优化服务:
select * from test_table where id = 2;
select * from test_table where c2 = '1';
select * from test_table where c3 = '1985-05-11';
select * from test_table where c1 is null;
select * from test_table where c1 = 4 and c3 = '1996-12-20';
以下查询可以使用搜索优化服务,因为隐式强制转换位于常量上,而不是列上:
select * from test_table where c2 = 2;
以下命令 无法 使用搜索优化服务,因为强制转换位于表的列上:
select * from test_table where cast(c2 as number) = 2;
搜索优化服务支持 IN 子句:
select id, c1, c2, c3
from test_table
where id IN (2, 3)
order by id;
如果谓词由搜索优化服务单独提供支持,则可以通过连词 AND
联接它们,并且仍受搜索优化服务支持:
select id, c1, c2, c3
from test_table
where c1 = 1
and
c3 = TO_DATE('2004-03-09')
order by id;
DELETE 和 UPDATE(和 MERGE)也可以使用搜索优化服务:
delete from test_table where id = 3;
update test_table set c1 = 99 where id = 4;