搜索优化服务

搜索优化服务可以显著提高某些类型的查找和分析查询的性能。该服务支持广泛的筛选谓词(请参阅 识别可从搜索优化中受益的查询)。

备注

要从比较使用和不使用搜索优化的执行时间的教程入手,请参阅 搜索优化入门 (https://quickstarts.snowflake.com/guide/getting_started_with_search_optimization/index.html)。

搜索优化服务旨在显著提高表上某些类型的查询的性能,包括:

确定可以从搜索优化服务中受益的查询后,可以为这些查询中使用的列和表 启用搜索优化

搜索优化服务通常对用户公开透明。查询的工作方式与未使用搜索优化时相同;只是有些查询速度更快。但是,搜索优化确实会对某些其他表操作产生影响。有关更多信息,请参阅 使用搜索优化表

搜索优化服务的工作原理

为了提高搜索查询的性能,搜索优化服务会创建并维护称为 搜索访问路径 的持久性数据结构。搜索访问路径可跟踪在每个 微分区 中可能找到的表列值,这样在扫描表时就可以跳过某些微分区。

维护服务负责创建和维护搜索访问路径:

  • 启用搜索优化后,维护服务会创建搜索访问路径,并使用执行查找所需的数据填充搜索访问路径。

    构建搜索访问路径可能需要花费大量时间,具体取决于表的大小。维护服务在后台运行,不会阻止对表的任何操作。在完全构建搜索访问路径之前,不会加速查询。

  • 更新表中的数据时(例如,通过加载新数据集或通过 DML 操作),维护服务会自动更新搜索访问路径,以反映对数据的更改。

    如果在搜索访问路径仍在更新时运行查询,则查询运行速度可能会变慢,但仍会返回正确的结果。

每个表的维护服务的进度会在 SHOW TABLES 输出的 search_optimization_progress 列中显示。在衡量新优化的表的搜索优化性能改进情况之前,请确保此列显示该表已完全优化。

搜索访问路径维护公开透明。无需创建虚拟仓库,即可运行维护服务。但是,维护的存储和计算资源是有成本的。有关成本的更多详细信息,请参阅 搜索优化成本估算和管理

用于优化查询性能的其他选项

搜索优化服务是优化查询性能的几种方法之一。其他技术包括:

  • 查询加速。

  • 对表进行聚类。

  • 创建一个或多个物化视图(聚类或非聚类)。

如下表所示,每种技术都有不同的优势:

功能

支持的查询类型

备注

搜索优化服务

搜索优化服务可以提高对 受支持数据类型 的搜索性能。

Query Acceleration Service

带有筛选器或聚合功能的查询。如果查询包括 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);
Copy

将 SEARCH OPTIMIZATION 属性添加到表中:

alter table test_table add search optimization;
Copy

以下查询可以使用搜索优化服务:

select * from test_table where id = 2;
Copy
select * from test_table where c2 = '1';
Copy
select * from test_table where c3 = '1985-05-11';
Copy
select * from test_table where c1 is null;
Copy
select * from test_table where c1 = 4 and c3 = '1996-12-20';
Copy

以下查询可以使用搜索优化服务,因为隐式强制转换位于常量上,而不是列上:

select * from test_table where c2 = 2;
Copy

以下命令 无法 使用搜索优化服务,因为强制转换位于表的列上:

select * from test_table where cast(c2 as number) = 2;
Copy

搜索优化服务支持 IN 子句:

select id, c1, c2, c3
    from test_table
    where id IN (2, 3)
    order by id;
Copy

如果谓词由搜索优化服务单独提供支持,则可以通过连词 AND 联接它们,并且仍受搜索优化服务支持:

select id, c1, c2, c3
    from test_table
    where c1 = 1
       and
          c3 = TO_DATE('2004-03-09')
    order by id;
Copy

DELETE 和 UPDATE(和 MERGE)也可以使用搜索优化服务:

delete from test_table where id = 3;
Copy
update test_table set c1 = 99 where id = 4;
Copy
语言: 中文