识别可从搜索优化中受益的查询

搜索优化可以提高许多查询的性能。本主题介绍搜索优化对哪些查询帮助最大,以及哪些查询 :ref:` 不会从中受益<label-search_optimization_limitations>`。

一般查询特征

对于具有以下特征的查询,搜索优化提高其性能的效果最佳:

  • 查询涉及主群集键以外的一列或多列。

  • 查询通常运行几秒钟或更长时间(在应用搜索优化之前)。在大多数情况下,搜索优化不会大幅提高执行时间在亚秒级的查询的性能。

  • 查询筛选器操作访问的列中至少有一列具有 100,000 个或更多不同的值。

    若要确定非重复值的数量,可以使用以下任一方法:

    • 使用 APPROX_COUNT_DISTINCT 获取非重复值的近似数量:

      SELECT APPROX_COUNT_DISTINCT(column1) FROM table1;
      
      Copy
    • 使用 COUNT(DISTINCT <col_name>) 获取非重复值的实际数量:

      SELECT COUNT(DISTINCT c1), COUNT(DISTINCT c2) FROM test_table;
      
      Copy

    因为只需要非重复值数量的近似值,因此可以考虑使用 APPROX_COUNT_DISTINCT,它通常比 COUNT(DISTINCT <col_name>) 更快、更便宜。

支持的数据类型

搜索优化服务目前支持以下数据类型:

  • :ref:`label-data_types_for_fixed_point_numbers`(例如 INTEGER 和 NUMERIC)

  • :doc:`/sql-reference/data-types-text`(例如 VARCHAR 和 BINARY)

  • :doc:`/sql-reference/data-types-datetime`(例如 DATE、TIME 和 TIMESTAMP)

  • :doc:`/sql-reference/data-types-semistructured`(例如 VARIANT、OBJECT 和 ARRAY)

  • GEOGRAPHY 数据类型

Queries that involve other values of other data types (for example, FLOAT, DECFLOAT, or GEOMETRY) don't benefit.

Supported table types

The search optimization service currently supports the following types of tables:

The search optimization service currently doesn't support the following types of tables:

支持的谓词类型

搜索优化可以提高使用以下类型的谓词进行查询的性能:

支持排序规则

搜索优化可以提升在定义了 ​​:ref:COLLATE子句​​ <label-collate_clause> 的列上执行查询的性能,具体效果取决于搜索方法:

  • 当在使用 EQUALITY 搜索方法的列上 启用 搜索优化时,任何排序规则规范都可以使用。

  • 当在使用 FULL_TEXTSUBSTRING 搜索方法的列上启用搜索优化时,支持 'utf8''bin' 排序规则规范。

有关搜索方法的更多信息,请参阅 ALTER TABLE ...ADD SEARCH OPTIMIZATION,在一个或多个账户中创建辅助连接,并将其链接到主连接。

搜索优化不支持使用 COLLATE 函数​更改列排序规则规范的谓词。

例如,创建一个具有排序规则规范的列的表并插入一行:

CREATE OR REPLACE TABLE search_optimization_collation_demo (
  en_ci_col VARCHAR COLLATE 'en-ci',
  utf_8_col VARCHAR COLLATE 'utf8');

INSERT INTO search_optimization_collation_demo VALUES (
  'test_collation_1',
  'test_collation_2');
Copy

为表中两个列的相等谓词启用搜索优化:

ALTER TABLE search_optimization_collation_demo
  ADD SEARCH OPTIMIZATION ON EQUALITY(en_ci_col, utf_8_col);
Copy

以下查询可以受益于搜索优化:

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2';
Copy

以下查询无法受益于搜索优化,因为它使用 COLLATE 函数更改了 utf_8_col 列的排序规则规范:

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col COLLATE 'de-ci' = 'test_collation_2';
Copy

以下查询同样无法受益于搜索优化。根据 排序规则优先级,查询通过 COLLATE 函数对列 utf_8_col 列应用了 'de-ci' 排序规则。

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2' COLLATE 'de-ci';
Copy

支持 Apache Iceberg™ 表

搜索优化可以提高针对 Apache Iceberg™ 表的查询的性能。有关为 Iceberg 表配置搜索优化的信息,请参阅 ALTER ICEBERG TABLE

以下限制适用于 Iceberg 表的搜索优化支持:

  • 无法为具有 Iceberg 表不支持的数据类型(包括 半结构化地理空间 数据类型)的列添加搜索优化。有关更多信息,请参阅 Apache Iceberg™ 表的数据类型

  • 搜索优化服务不支持具有 结构化数据类型 的列。

  • 如果 Apache Parquet™ 文件太大(例如,压缩了数百兆字节),则在某些情况下,查询可能无法完全受益于搜索优化服务。

适用于 Snowflake 表搜索优化的其他限制也适用于 Iceberg 表。有关更多信息,请参阅 无法从搜索优化中受益的查询

视图的潜在改进

搜索优化服务可以间接提高视图(包括安全视图)的性能。如果视图的基表启用了搜索优化,并且查询对该表使用选择性谓词,则搜索优化服务可以在筛选行时提高性能。请参阅 支持的谓词类型

并非视图中的所有表都需要启用搜索优化。每个表都会独立执行搜索优化。

无法从搜索优化中受益的查询

Currently, the search optimization service doesn't support floating point data types, GEOMETRY, or other data types not already discussed. Snowflake might add support for more data types in the future.

Additionally, the search optimization service doesn't support the following:

  • Some table types.

    有关更多信息,请参阅 Supported table types

  • 物化视图。

  • 列连接。

  • 分析表达式。

  • 对表列进行强制类型转换(定点数强制转换为字符串除外)。

    Although search optimization supports predicates with implicit and explicit casts on constant values, it doesn't support predicates that cast values in the actual table column (except for casts from INTEGER and NUMBER to VARCHAR).

    例如,支持以下谓词,因为它们对常量值(不是表列中的值)使用隐式和显式强制类型转换:

    -- Supported predicate
    -- (where the string '2020-01-01' is implicitly cast to a date)
    WHERE timestamp1 = '2020-01-01';
    
    -- Supported predicate
    -- (where the string '2020-01-01' is explicitly cast to a date)
    WHERE timestamp1 = '2020-01-01'::date;
    
    Copy

    不支持以下谓词,因为对表列中的值使用了强制类型转换:

    -- Unsupported predicate
    -- (where values in a VARCHAR column are cast to DATE)
    WHERE to_date(varchar_column) = '2020-01-01';
    
    Copy

    搜索优化服务考虑的是列的原始值,而不是强制类型转换后的值。因此,搜索优化服务不用于使用这些谓词的查询。

如前所述,此规则的例外情况是将表列中的 INTEGER 或 VARCHAR 值强制转换为 NUMBER 值。搜索优化服务确实支持这种类型的谓词:

-- Supported predicate
-- (where values in a numeric column are cast to a string)
WHERE cast(numeric_column as varchar) = '2'
Copy

Search optimization doesn't improve performance of queries that use Time Travel because search optimization works only on active data.

语言: 中文