启用和禁用搜索优化¶
要启用搜索优化,请使用具有必要权限的角色,然后使用 ALTER TABLE ... ADD SEARCH OPTIMIZATION 命令对整个表或特定列启用搜索优化。
所需的访问控制权限¶
要添加、配置或删除表的搜索优化,您必须:
拥有表的 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>` ... ADD SEARCH OPTIMIZATION 命令,但 不要 使用 ON 子句。
为特定列启用搜索优化可避免将 credit 用于为查询中不常使用的列创建搜索访问路径,还允许您为每一列选择其他要优化的查询类型,从而进一步提高性能。
若要启用特定列的搜索优化并指定要优化的查询类型,请使用 ON 子句(在 ALTER TABLE ... ADD SEARCH OPTIMIZATION 命令中)。在 ADD SEARCH OPTIMIZATION 的 ON 子句中,可以指定为哪些列应启用搜索优化。为给定列启用搜索优化时,还可以指定搜索方法(例如用于相等和 IN 搜索的 EQUALITY、用于 GEOGRAPHY 搜索的 GEO 或用于子字符串搜索的 SUBSTRING)。可以在同一列上启用多种搜索方法。
通常,最佳做法是仅针对特定列启用搜索优化。
以下各节介绍如何为表配置搜索优化:
配置搜索优化后,可以检查配置是否正确。
如果发现搜索优化没有带来足够的好处,可以从特定列或整个表中移除搜索优化。
为特定列启用搜索优化¶
要为特定列配置搜索优化,请使用 ALTER TABLE ... ADD SEARCH OPTIMIZATION 命令与 ON 子句。
备注
运行此命令时,请使用 有权向表添加搜索优化 的角色。
ON 子句指定要为特定列配置搜索优化。有关语法的详细信息,请参阅 有关 ALTER TABLE ...ADD SEARCH OPTIMIZATION 的章节。
备注
如果只想对表中所有适用列应用相等和 IN 谓词的搜索优化,请参阅 启用整个表的搜索优化。
运行此命令后,可以 验证列是否已配置为搜索优化。
以下各节将举例说明如何指定搜索优化配置:
示例:支持特定列的相相等谓词和 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;
有关语法的更多信息,请参阅 有关 ALTER TABLE ...DROP SEARCH OPTIMIZATION 的章节。
从表中删除搜索优化¶
要从表中删除 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 ...DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> ` 的章节。