启用和禁用搜索优化¶
要启用搜索优化,请使用具有必要权限的角色,然后使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add>
命令对整个表或特定列启用搜索优化。
所需的访问控制权限¶
要添加、配置或删除表的搜索优化,您必须:
拥有表的 OWNERSHIP 权限。
对包含表的架构拥有 ADD SEARCH OPTIMIZATION 权限。要授予此权限,请执行以下操作:
GRANT ADD SEARCH OPTIMIZATION ON SCHEMA <schema_name> TO ROLE <role>
若要使用搜索优化服务进行查询,只需拥有表的 SELECT 权限。
您不需要任何其他权限。由于 SEARCH OPTIMIZATION 是表属性,因此在查询表时,系统会自动检测和使用它(如果适用)。
配置搜索优化¶
备注
为大型表(包含数以兆字节 [TB] 数据或更多数据的表)添加搜索优化可能会在短时间内立即增加 credit 消耗。
为表添加搜索优化后,维护服务会立即开始在后台为表构建搜索访问路径。如果表很大,维护服务可能会对这项工作进行大规模并行化,这可能会导致成本在短时间内增加。
在为大型表添加搜索优化之前,请 估算成本,以便心中有数。
启用搜索优化时,可以选择为整个表或表中的特定列启用搜索优化。
为整个表启用搜索优化后,可以对所有符合条件的列进行点查询。
要为整个表启用搜索优化,请使用 :doc:` ALTER TABLE </sql-reference/sql/alter-table>` ...:ref:
ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add>
命令,但 不要 使用 ON 子句。为特定列启用搜索优化可避免将 credit 用于为查询中不常使用的列创建搜索访问路径,还允许您为每一列选择其他要优化的查询类型,从而进一步提高性能。
若要启用特定列的搜索优化并指定要优化的查询类型,请使用 ON 子句(在 ALTER TABLE ...ADD SEARCH OPTIMIZATION 命令中)。在 ADD SEARCH OPTIMIZATION 的 ON 子句中,可以指定为哪些列应启用搜索优化。为给定列启用搜索优化时,还可以指定搜索方法(例如 EQUALITY 用于相等和 IN 搜索、 GEO 用于 GEOGRAPHY 搜索或 SUBSTRING 子字符串搜索)。您可以在同一列上启用多种搜索方法。
通常,最佳做法是仅针对特定列启用搜索优化。
以下各节介绍如何为表配置搜索优化:
配置搜索优化后,可以检查配置是否正确。
如果发现搜索优化没有带来足够的好处,可以从特定列或整个表中移除搜索优化。
为特定列启用搜索优化¶
要为特定列配置搜索优化,请使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add>
命令与 ON 子句。
备注
运行此命令时,请使用 有权向表添加搜索优化 的角色。
ON 子句指定要为特定列配置搜索优化。有关语法的详细信息,请参阅 有关 ALTER TABLE ...ADD SEARCH OPTIMIZATION 的章节。
备注
如果只想对表中所有适用列应用相等和 IN 谓词的搜索优化,请参阅 为整个表启用搜索优化。
运行此命令后,可以 验证列是否已配置为搜索优化。
以下各节将举例说明如何指定搜索优化配置:
示例:特定列上的全文搜索优化¶
您可以使用 SEARCH 和 SEARCH_IP 函数进行文本搜索。为了提高在使用这些函数时的查询执行性能,请启用 FULL_TEXT 搜索优化。您可以通过使用表中不同列的不同子集和不同的文本分析器来启用 FULL_TEXT 搜索优化。有关不同分析器行为的信息,请参阅 如何将搜索词划分为词元。
使用以下语法对表中的一组列启用 FULL_TEXT 搜索优化。
ALTER TABLE <name> ADD SEARCH OPTIMIZATION
ON FULL_TEXT( { * | <col1> [ , <col2>, ... ] } [ , ANALYZER => '<analyzer_name>' ]);
您指定的列必须是 VARCHAR、VARIANT、ARRAY 或 OBJECT 列。不支持其他数据类型的列。此外,您可以指定类型为 VARIANT、ARRAY 或 OBJECT 的列的单独 路径。
您可以指定通配符星号字符 (*
) 来代替列的列表。在这种情况下,对所有支持类型的列自动启用优化。
如果指定,则 ANALYZER => 'analyzer_name' 实参必须是为 SEARCH 函数记录的选项之一。如果您未指定分析器,则使用 DEFAULT_ANALYZER。
备注
为了优化 SEARCH 函数的查询执行,在 ALTER TABLE 命令中为搜索优化指定的分析器必须与 SEARCH 函数调用中指定的分析器相同。如果分析器不匹配,则搜索访问路径将不会被选择。
此示例对三个 VARCHAR 列启用 FULL_TEXT 搜索优化,这些列可能是 SEARCH 查询的目标。
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
要描述此表的搜索优化配置,请运行以下命令:
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+-----------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+-----------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 3 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+-----------+------------------+--------+
有关更多信息,请参阅 显示表的搜索优化配置。
此示例对 VARCHAR 列启用 FULL_TEXT 搜索优化,这些列可能是 SEARCH_IP 查询的目标。
ALTER TABLE ipt ADD SEARCH OPTIMIZATION ON FULL_TEXT(ip1, ANALYZER => 'ENTITY_ANALYZER');
要移除搜索优化配置,请运行以下命令之一:
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON play, character, line;
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON 1, 2, 3;
在第三个 ALTER TABLE ...DROP SEARCH OPTIMIZATION 命令中,1, 2, 3
指的是 DESCRIBE 命令返回的表达式 IDs。
您还可以通过删除列的子集(按名称或表达式 ID)来修改 FULL_TEXT 搜索优化配置。有关更多信息,请参阅 从特定列或整个表中移除搜索优化。
有关更多启用和删除 FULL_TEXT 搜索优化的示例,请参阅 ADD(和 DROP)FULL_TEXT 搜索优化的示例。
示例:支持特定列的相等谓词和 IN 谓词¶
要对表 t1
中的列 c1
、c2
和 c3
进行优化搜索,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3);
还您也可以在 ON 子句中多次指定相同的搜索方法:
-- This statement is equivalent to the previous statement.
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
示例:支持所有适用列的相等谓词和 IN 谓词¶
要使用相等谓词对表中所有适用的列进行搜索优化,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(*);
请注意以下事项:
如 搜索方法和目标语法说明 中所述,对于给定方法,不能同时指定星号和特定列。
尽管省略 ON 子句也会对表中所有适用列的相等谓词和 IN 谓词进行搜索优化配置,但指定和省略 ON 子句之间还是存在差异。请参阅 为整个表启用搜索优化。
示例:支持不同类型的谓词¶
要优化使用相等谓词对列 c1
和 c2
进行的搜索以及对列 c3
进行的子串搜索,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2), SUBSTRING(c3);
示例:支持同一列上的不同谓词¶
要优化对同一列 (c1
) 上的相等谓词和子字符串谓词的搜索,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), SUBSTRING(c1);
示例:为 VARIANT 中的元素支持相等谓词和 IN 谓词¶
要对嵌套在 VARIANT 列 c4
中 user
元素中的 VARIANT 元素 uuid
使用相等谓词进行优化搜索,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c4:user.uuid);
示例:支持地理空间函数¶
要使用在 c1
列中使用带有 GEOGRAPHY 对象的地理空间函数的谓词进行优化搜索,请执行以下语句:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON GEO(c1);
为整个表启用搜索优化¶
要为所有受支持数据类型( VARIANT 和 GEOGRAPHY 除外)指定 EQUALITY,请使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add>
命令,而不使用 ON 子句。
备注
运行此命令时,请使用 有权向表添加搜索优化 的角色。
例如:
alter table test_table add search optimization;
有关语法的详细信息,请参阅 :ref:` ALTER TABLE 中有关搜索优化的章节 <label-alter_table_searchoptimizationaction>`。
运行此命令后,可以 验证列是否已配置为搜索优化。
对后续添加的列的影响¶
运行 ALTER TABLE ...ADD SEARCH OPTIMIZATION 命令(不使用 ON 子句)后,随后添加到表中的列也将配置为 EQUALITY 优化。
但是,如果对同一个表执行 ALTER TABLE ... { ADD | DROP } SEARCH OPTIMIZATION 且使用 ON 子句,那么随后添加到表中的列将不会自动配置为 EQUALITY。您必须执行 ALTER TABLE ...ADD SEARCH OPTIMIZATION ON ...才能为这些新添加的列配置 EQUALITY。
验证表是否配置了搜索优化¶
要验证表及其列是否已配置搜索优化,请执行以下操作:
运行 SHOW TABLES 命令验证是否已添加搜索优化,并确定表的优化程度。
例如:
SHOW TABLES LIKE '%test_table%';
在此命令的输出中:
验证 SEARCH_OPTIMIZATION 是否为
ON
,确定是否已添加搜索优化。检查 SEARCH_OPTIMIZATION_PROGRESS 的值。这个值指定了迄今为止已优化的表的百分比。
搜索优化首次添加到表时,性能优势不会立即显现。搜索优化服务会在后台开始填充数据。当维护跟上表的当前状态时,优势就会逐渐显现。
在运行查询以验证搜索优化是否正常工作之前,请等待查询显示表已完全优化。
运行查询以验证搜索优化是否有效。
请注意,Snowflake 优化器会自动选择何时对特定查询使用搜索优化服务。用户无法控制搜索优化用于哪些查询。
选择搜索优化服务旨在优化的查询。请参阅 识别可从搜索优化中受益的查询。
在 Web UI 中,查看此查询的查询计划,并验证查询节点“Search Optimization Access”是否是查询计划的一部分。
显示表的搜索优化配置¶
要显示表的搜索优化配置,请使用 DESCRIBE SEARCH OPTIMIZATION 命令。
例如,假设您执行以下语句来配置列的搜索优化:
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1);
执行 DESCRIBE SEARCH OPTIMIZATION 会产生以下输出:
DESCRIBE SEARCH OPTIMIZATION ON t1;
+---------------+----------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
+---------------+----------+--------+------------------+--------+
| 1 | EQUALITY | C1 | NUMBER(38,0) | true |
+---------------+----------+--------+------------------+--------+
从特定列或整个表中移除搜索优化¶
您可以移除特定列的搜索优化配置,也可以从整个表中移除 SEARCH OPTIMIZATION 属性。
删除特定列的搜索优化¶
若要弃用删除特定列的搜索优化配置,请使用以下命令:ALTER TABLE ...:ref:DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop>
命令与 ON 子句。
例如,假设执行 DESCRIBE SEARCH OPTIMIZATION 命令会打印以下表达式:
DESCRIBE SEARCH OPTIMIZATION ON t1;
+---------------+-----------+-----------+-------------------+--------+
| expression_id | method | target | target_data_type | active |
+---------------+-----------+-----------+-------------------+--------+
| 1 | EQUALITY | C1 | NUMBER(38,0) | true |
| 2 | EQUALITY | C2 | VARCHAR(16777216) | true |
| 3 | EQUALITY | C4 | NUMBER(38,0) | true |
| 4 | EQUALITY | C5 | VARCHAR(16777216) | true |
| 5 | EQUALITY | V1 | VARIANT | true |
| 6 | SUBSTRING | C2 | VARCHAR(16777216) | true |
| 7 | SUBSTRING | C5 | VARCHAR(16777216) | true |
| 8 | GEO | G1 | GEOGRAPHY | true |
| 9 | EQUALITY | V1:"key1" | VARIANT | true |
| 10 | EQUALITY | V1:"key2" | VARIANT | true |
+---------------+-----------+-----------+-------------------+--------+
要启用对列 c2
子字符串的搜索优化,请执行以下语句:
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON SUBSTRING(c2);
要启用列 c5
上所有方法的搜索优化,请执行以下语句:
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON c5;
由于列 c5
已配置为优化相等和子字串搜索,因此上面的语句弃用了对 c5
进行相等和子字符串搜索的配置。
要弃用对列 c1
的相等搜索优化并弃用表达式 IDs 6
和 8
指定的配置,请执行以下语句:
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON EQUALITY(c1), 6, 8;
有关语法的更多信息,请参阅 :ref:`有关 ALTER TABLE ...SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 的章节 `。
从表中移除搜索优化¶
要从表中删除 SEARCH OPTIMIZATION 属性,请执行以下操作:
换到有权 从表中移除搜索优化 的角色。
运行 ALTER TABLE ...:ref:
DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop>
命令,不使用 ON 子句:ALTER TABLE [IF EXISTS] <table_name> DROP SEARCH OPTIMIZATION;
例如:
alter table test_table drop search optimization;
有关更多信息,请参阅 :ref:`有关 ALTER TABLE ...SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 的章节 `。