Search optimization service¶
搜索优化服务可以显著提高某些类型的查找和分析查询的性能。支持广泛的筛选谓词(请参阅 识别可从搜索优化中受益的查询)。
备注
要从比较使用和不使用搜索优化的执行时间的教程入手,请参阅 搜索优化入门 (https://quickstarts.snowflake.com/guide/getting_started_with_search_optimization/index.html)。
搜索优化服务旨在显著提高对表执行某些类型的查询的性能,包括:
对表执行选择性点查找查询。点查找查询仅会返回一个或少量不同的行。用例示例包括:
需要通过高度选择性筛选器提高关键仪表板响应速度的业务用户。
正在探索大量数据并寻找特定数据子集的数据科学家。
根据一组广泛的筛选谓词检索一小部分结果的数据应用程序。
有关更多信息,请参阅 通过搜索优化加速点查找查询。
Character data (text) and IP address searches executed with the SEARCH and SEARCH_IP functions. For more information, see 通过搜索优化加速文本查询.
子字符串和正则表达式搜索(例如 LIKE、ILIKE、RLIKE 等)。有关更多信息,请参阅 通过搜索优化加快子字符串和正则表达式查询。
对使用以下谓词类型的 :doc:`VARIANT、OBJECT 和 ARRAY </sql-reference/data-types-semistructured>`(半结构化)列中的元素执行的查询:
相等谓词。
IN 谓词。
使用 ARRAY_CONTAINS 的谓词。
使用 ARRAYS_OVERLAP 的谓词。
使用 SEARCH 进行全文搜索的谓词。
子字符串和正则表达式谓词。
检查 NULL 值的谓词。
有关更多信息,请参阅 通过搜索优化加速半结构化数据的查询。
使用带有 GEOGRAPHY 值的选定地理空间函数的查询。有关更多信息,请参阅 通过搜索优化加速地理空间查询。
确定可以从搜索优化服务中受益的查询后,可以为这些查询中使用的列和表 启用搜索优化。
搜索优化服务通常对用户公开透明。查询的工作方式与未使用搜索优化时相同;只是有些查询速度更快。但是,搜索优化确实会对某些其他表操作产生影响。有关更多信息,请参阅 使用搜索优化表。
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);
使用 ALTER TABLE 将 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;