启用和禁用搜索优化

要启用搜索优化,请使用具有必要权限的角色,然后使用 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>
    
    Copy

若要使用搜索优化服务进行查询,只需拥有表的 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 谓词的搜索优化,请参阅 为整个表启用搜索优化

运行此命令后,可以 验证列是否已配置为搜索优化

以下各节将举例说明如何指定搜索优化配置:

示例:特定列上的全文搜索优化

您可以使用 SEARCHSEARCH_IP 函数进行文本搜索。为了提高在使用这些函数时的查询执行性能,请启用 FULL_TEXT 搜索优化。您可以通过使用表中不同列的不同子集和不同的文本分析器来启用 FULL_TEXT 搜索优化。有关不同分析器行为的信息,请参阅 如何将搜索词划分为词元

使用以下语法对表中的一组列启用 FULL_TEXT 搜索优化。

ALTER TABLE <name> ADD SEARCH OPTIMIZATION
  ON FULL_TEXT( { * | <col1> [ , <col2>, ... ] } [ , ANALYZER => '<analyzer_name>' ]);
Copy

您指定的列必须是 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);
Copy

要描述此表的搜索优化配置,请运行以下命令:

DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+-----------+------------------+--------+
| 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');
Copy

要移除搜索优化配置,请运行以下命令之一:

ALTER TABLE lines DROP SEARCH OPTIMIZATION
  ON FULL_TEXT(play, character, line);
Copy
ALTER TABLE lines DROP SEARCH OPTIMIZATION
  ON play, character, line;
Copy
ALTER TABLE lines DROP SEARCH OPTIMIZATION
  ON 1, 2, 3;
Copy

在第三个 ALTER TABLE ...DROP SEARCH OPTIMIZATION 命令中,1, 2, 3 指的是 DESCRIBE 命令返回的表达式 IDs。

您还可以通过删除列的子集(按名称或表达式 ID)来修改 FULL_TEXT 搜索优化配置。有关更多信息,请参阅 从特定列或整个表中移除搜索优化

有关更多启用和删除 FULL_TEXT 搜索优化的示例,请参阅 ADD(和 DROP)FULL_TEXT 搜索优化的示例

示例:支持特定列的相等谓词和 IN 谓词

要对表 t1 中的列 c1c2c3 进行优化搜索,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3);
Copy

还您也可以在 ON 子句中多次指定相同的搜索方法:

-- This statement is equivalent to the previous statement.
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
Copy

示例:支持所有适用列的相等谓词和 IN 谓词

要使用相等谓词对表中所有适用的列进行搜索优化,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(*);
Copy

请注意以下事项:

  • 搜索方法和目标语法说明 中所述,对于给定方法,不能同时指定星号和特定列。

  • 尽管省略 ON 子句也会对表中所有适用列的相等谓词和 IN 谓词进行搜索优化配置,但指定和省略 ON 子句之间还是存在差异。请参阅 为整个表启用搜索优化

示例:支持不同类型的谓词

要优化使用相等谓词对列 c1c2 进行的搜索以及对列 c3 进行的子串搜索,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2), SUBSTRING(c3);
Copy

示例:支持同一列上的不同谓词

要优化对同一列 (c1) 上的相等谓词和子字符串谓词的搜索,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), SUBSTRING(c1);
Copy

示例:为 VARIANT 中的元素支持相等谓词和 IN 谓词

要对嵌套在 VARIANT 列 c4user 元素中的 VARIANT 元素 uuid 使用相等谓词进行优化搜索,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c4:user.uuid);
Copy

示例:支持地理空间函数

要使用在 c1 列中使用带有 GEOGRAPHY 对象的地理空间函数的谓词进行优化搜索,请执行以下语句:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON GEO(c1);
Copy

为整个表启用搜索优化

要为所有受支持数据类型( VARIANT 和 GEOGRAPHY 除外)指定 EQUALITY,请使用 ALTER TABLE ...:ref:ADD SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_add> 命令,而不使用 ON 子句。

备注

运行此命令时,请使用 有权向表添加搜索优化 的角色。

例如:

alter table test_table add search optimization;
Copy

有关语法的详细信息,请参阅 :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。

验证表是否配置了搜索优化

要验证表及其列是否已配置搜索优化,请执行以下操作:

  1. 显示表及其列的搜索优化配置

  2. 运行 SHOW TABLES 命令验证是否已添加搜索优化,并确定表的优化程度。

    例如:

    SHOW TABLES LIKE '%test_table%';
    
    Copy

    在此命令的输出中:

    • 验证 SEARCH_OPTIMIZATION 是否为 ON,确定是否已添加搜索优化。

    • 检查 SEARCH_OPTIMIZATION_PROGRESS 的值。这个值指定了迄今为止已优化的表的百分比。

      搜索优化首次添加到表时,性能优势不会立即显现。搜索优化服务会在后台开始填充数据。当维护跟上表的当前状态时,优势就会逐渐显现。

      在运行查询以验证搜索优化是否正常工作之前,请等待查询显示表已完全优化。

  3. 运行查询以验证搜索优化是否有效。

    请注意,Snowflake 优化器会自动选择何时对特定查询使用搜索优化服务。用户无法控制搜索优化用于哪些查询。

    选择搜索优化服务旨在优化的查询。请参阅 识别可从搜索优化中受益的查询

  4. 在 Web UI 中,查看此查询的查询计划,并验证查询节点“Search Optimization Access”是否是查询计划的一部分。

显示表的搜索优化配置

要显示表的搜索优化配置,请使用 DESCRIBE SEARCH OPTIMIZATION 命令。

例如,假设您执行以下语句来配置列的搜索优化:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1);
Copy

执行 DESCRIBE SEARCH OPTIMIZATION 会产生以下输出:

DESCRIBE SEARCH OPTIMIZATION ON t1;

+---------------+----------+--------+------------------+--------+
| expression_id |  method  | target | target_data_type | active |
+---------------+----------+--------+------------------+--------+
| 1             | EQUALITY | C1     | NUMBER(38,0)     | true   |
+---------------+----------+--------+------------------+--------+
Copy

从特定列或整个表中移除搜索优化

您可以移除特定列的搜索优化配置,也可以从整个表中移除 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   |
+---------------+-----------+-----------+-------------------+--------+
Copy

要启用对列 c2 子字符串的搜索优化,请执行以下语句:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON SUBSTRING(c2);
Copy

要启用列 c5 上所有方法的搜索优化,请执行以下语句:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON c5;
Copy

由于列 c5 已配置为优化相等和子字串搜索,因此上面的语句弃用了对 c5 进行相等和子字符串搜索的配置。

要弃用对列 c1 的相等搜索优化并弃用表达式 IDs 68 指定的配置,请执行以下语句:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON EQUALITY(c1), 6, 8;
Copy

有关语法的更多信息,请参阅 :ref:`有关 ALTER TABLE ...SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 的章节 `

从表中移除搜索优化

要从表中删除 SEARCH OPTIMIZATION 属性,请执行以下操作:

  1. 换到有权 从表中移除搜索优化 的角色。

  2. 运行 ALTER TABLE ...:ref:DROP SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 命令,不使用 ON 子句:

    ALTER TABLE [IF EXISTS] <table_name> DROP SEARCH OPTIMIZATION;
    
    Copy

    例如:

    alter table test_table drop search optimization;
    
    Copy

有关更多信息,请参阅 :ref:`有关 ALTER TABLE ...SEARCH OPTIMIZATION <label-alter_table_searchoptimizationaction_drop> 的章节 `

语言: 中文