启用和禁用搜索优化¶
要启用搜索优化,请使用具有必要权限的角色,然后使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add> 命令对整个表或特定列启用搜索优化。
所需的访问控制权限¶
要添加、配置或删除表的搜索优化,您必须:
拥有表的 OWNERSHIP 权限。
对包含表的架构拥有 ADD SEARCH OPTIMIZATION 权限。要授予此权限,请执行以下操作:
若要使用搜索优化服务进行查询,只需拥有表的 SELECT 权限。
您不需要任何其他权限。由于 SEARCH OPTIMIZATION 是表属性,因此在查询表时,系统会自动检测和使用它(如果适用)。
配置搜索优化¶
备注
为大型表(包含数以兆字节 [TB] 数据或更多数据的表)添加搜索优化可能会在短时间内立即增加 credit 消耗。
为表添加搜索优化后,维护服务会立即开始在后台为表构建搜索访问路径。如果表很大,维护服务可能会对这项工作进行大规模并行化,这可能会导致成本在短时间内增加。
在为大型表添加搜索优化之前,请 估算成本,以便心中有数。
启用搜索优化时,可以选择为整个表或表中的特定列启用搜索优化。
为整个表启用搜索优化后,可以对所有符合条件的列进行点查询。
要为整个表启用搜索优化,请使用 :doc:` ALTER TABLE </sql-reference/sql/alter-table>` ...:ref:
ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add>命令,但 不要 使用 ON 子句。为特定列启用搜索优化可避免将 credit 用于为查询中不常使用的列创建搜索访问路径,还允许您为每一列选择其他要优化的查询类型,从而进一步提高性能。
要启用特定列的搜索优化并指定要优化的查询类型,请在 ALTER TABLE ... ADD SEARCH OPTIMIZATION 命令 <label-search_optimization_service_configuration_adding>` 中使用 :ref:`ON 子句。在 ADD SEARCH OPTIMIZATION 的 ON 子句中,可以指定为哪些列应启用搜索优化。为给定列启用搜索优化时,您还可以指定搜索方法(例如 EQUALITY 用于相等和 IN 搜索、GEO 用于 GEOGRAPHY 搜索或 SUBSTRING 用于子字符串搜索)。您可以在同一列上启用多种搜索方法。
通过使用 ALTER ICEBERG TABLE ... ADD SEARCH OPTIMIZATION 命令,您可以为整个 Apache Iceberg™ 表或为表中的特定列启用搜索优化。
通常,最佳做法是仅针对特定列启用搜索优化。
以下各节介绍如何为表配置搜索优化:
配置搜索优化后,可以检查配置是否正确。
如果发现搜索优化没有带来足够的好处,可以从特定列或整个表中移除搜索优化。
为特定列启用搜索优化¶
要为特定列配置搜索优化,请使用 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 搜索优化。
您指定的列必须是 VARCHAR、VARIANT、ARRAY 或 OBJECT 列。不支持其他数据类型的列。此外,您可以指定类型为 VARIANT、ARRAY 或 OBJECT 的列的单独 路径。
您可以指定通配符星号字符 (*) 来代替列的列表。在这种情况下,对所有支持类型的列自动启用优化。
如果指定,则 ANALYZER => 'analyzer_name' 实参必须是为 SEARCH 函数记录的选项之一。如果您未指定分析器,则使用 DEFAULT_ANALYZER。
备注
为了优化 SEARCH 函数的查询执行,在 ALTER TABLE 命令中为搜索优化指定的分析器必须与 SEARCH 函数调用中指定的分析器相同。如果分析器不匹配,则搜索访问路径将不会被选择。
此示例对三个 VARCHAR 列启用 FULL_TEXT 搜索优化,这些列可能是 SEARCH 查询的目标。
要描述此表的搜索优化配置,请运行以下命令:
有关更多信息,请参阅 显示表的搜索优化配置。
此示例对 VARCHAR 列启用 FULL_TEXT 搜索优化,这些列可能是 SEARCH_IP 查询的目标。
要移除搜索优化配置,请运行以下命令之一:
在第三个 ALTER TABLE ...DROP SEARCH OPTIMIZATION 命令中,1, 2, 3 指的是 DESCRIBE 命令返回的表达式 IDs。
您还可以通过删除列的子集(按名称或表达式 ID)来修改 FULL_TEXT 搜索优化配置。有关更多信息,请参阅 从特定列或整个表中移除搜索优化。
有关更多启用和删除 FULL_TEXT 搜索优化的示例,请参阅 ADD(和 DROP)FULL_TEXT 搜索优化的示例。
示例:支持特定列的相等谓词和 IN 谓词¶
要对表 t1 中的列 c1、c2 和 c3 进行优化搜索,请执行以下语句:
还您也可以在 ON 子句中多次指定相同的搜索方法:
示例:支持所有适用列的相等谓词和 IN 谓词¶
要使用相等谓词对表中所有适用的列进行搜索优化,请执行以下语句:
请注意以下事项:
如 搜索方法和目标语法说明 中所述,对于给定方法,不能同时指定星号和特定列。
尽管省略 ON 子句也会对表中所有适用列的相等谓词和 IN 谓词进行搜索优化配置,但指定和省略 ON 子句之间还是存在差异。请参阅 为整个表启用搜索优化。
示例:支持不同类型的谓词¶
要优化使用相等谓词对列 c1 和 c2 进行的搜索以及对列 c3 进行的子串搜索,请执行以下语句:
示例:支持同一列上的不同谓词¶
要优化对同一列 (c1) 上的相等谓词和子字符串谓词的搜索,请执行以下语句:
示例:为 VARIANT 中的元素支持相等谓词和 IN 谓词¶
要对嵌套在 VARIANT 列 c4 中 user 元素中的 VARIANT 元素 uuid 使用相等谓词进行优化搜索,请执行以下语句:
示例:支持地理空间函数¶
要使用在 c1 列中使用带有 GEOGRAPHY 对象的地理空间函数的谓词进行优化搜索,请执行以下语句:
为整个表启用搜索优化¶
为所有受支持数据类型(:doc:` 半结构化 </sql-reference/data-types-semistructured>` 和 GEOGRAPHY 除外)指定 EQUALITY,请使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add> 命令,而不使用 ON 子句。
备注
运行此命令时,请使用 有权向表添加搜索优化 的角色。
例如:
有关语法的详细信息,请参阅 :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 命令验证是否已添加搜索优化,并确定表的优化程度。
例如:
在此命令的输出中:
验证 SEARCH_OPTIMIZATION 是否为
ON,确定是否已添加搜索优化。检查 SEARCH_OPTIMIZATION_PROGRESS 的值。这个值指定了迄今为止已优化的表的百分比。
搜索优化首次添加到表时,性能优势不会立即显现。搜索优化服务会在后台开始填充数据。当维护跟上表的当前状态时,优势就会逐渐显现。
在运行查询以验证搜索优化是否正常工作之前,请等待查询显示表已完全优化。
运行查询以验证搜索优化是否有效。
请注意,Snowflake 优化器会自动选择何时对特定查询使用搜索优化服务。用户无法控制搜索优化用于哪些查询。
选择搜索优化服务旨在优化的查询。请参阅 识别可从搜索优化中受益的查询。
在 Web UI 中,查看此查询的查询计划,并验证查询节点“Search Optimization Access”是否是查询计划的一部分。
显示表的搜索优化配置¶
要显示表的搜索优化配置,请使用 DESCRIBE SEARCH OPTIMIZATION 命令。
例如,假设您执行以下语句来配置列的搜索优化:
执行 DESCRIBE SEARCH OPTIMIZATION 会产生以下输出:
从特定列或整个表中移除搜索优化¶
您可以移除特定列的搜索优化配置,也可以从整个表中移除 SEARCH OPTIMIZATION 属性。
删除特定列的搜索优化¶
若要弃用删除特定列的搜索优化配置,请使用以下命令:ALTER TABLE ...:ref:DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 命令与 ON 子句。
例如,假设执行 DESCRIBE SEARCH OPTIMIZATION 命令会打印以下表达式:
要启用对列 c2 子字符串的搜索优化,请执行以下语句:
要启用列 c5 上所有方法的搜索优化,请执行以下语句:
由于列 c5 已配置为优化相等和子字串搜索,因此上面的语句弃用了对 c5 进行相等和子字符串搜索的配置。
要弃用对列 c1 的相等搜索优化并弃用表达式 IDs 6 和 8 指定的配置,请执行以下语句:
有关语法的更多信息,请参阅 有关 ALTER TABLE ...DROP SEARCH OPTIMIZATION,在一个或多个账户中创建辅助连接,并将其链接到主连接。
从表中移除搜索优化¶
要从表中删除 SEARCH OPTIMIZATION 属性,请执行以下操作:
换到有权 从表中移除搜索优化 的角色。
运行 ALTER TABLE ...:ref:
DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop>命令,不使用 ON 子句:例如:
有关更多信息,请参阅 有关 ALTER TABLE ...DROP SEARCH OPTIMIZATION,在一个或多个账户中创建辅助连接,并将其链接到主连接。