Search optimization service

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

备注

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

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

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

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

How the search optimization service works

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

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

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

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

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

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

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

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

Other options for optimizing query performance

The search optimization service is one of several ways to optimize query performance. The following list shows other techniques:

  • Query acceleration

  • Creating one or more materialized views (clustered or unclustered)

  • Clustering a table

For more information, see 优化查询性能.

示例

首先,创建一个包含数据的表:

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

使用 ALTER TABLE 将 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
语言: 中文