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

搜索优化可以提高许多查询的性能。本主题介绍搜索优化对哪些查询帮助最大,以及哪些查询 :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 数据类型

涉及其他数据类型(例如 FLOAT​​​​ 或 GEOMETRY​​​​)其他值的查询不会受益。

支持的谓词类型

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

排序规则支持

搜索优化可以提升在定义了 ​​: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

视图的潜在改进

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

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

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

目前,搜索优化服务不支持浮点数据类型,GEOMETRY 或其他未讨论过的数据类型。Snowflake 将来可能会添加对更多数据类型的支持。

此外,搜索优化服务不支持以下各项:

  • 外部表。

  • 物化视图。

  • 列连接。

  • 分析表达式。

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

    尽管搜索优化支持对常量值进行隐式和显式强制转换的谓词,但不支持对实际表中的值进行强制类型转换的谓词(从 INTEGER 和 NUMBER 到 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

搜索优化不会提高使用 Time Travel 的查询的性能,因为搜索优化仅适用于活动数据。

语言: 中文