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

搜索优化可以提高许多查询的性能。本主题介绍搜索优化对哪些查询帮助最大,以及哪些查询 :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>) 更快、更便宜。

支持的数据类型

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

  • 定点数(例如 INTEGER、NUMERIC)。

  • DATE、TIME 和 TIMESTAMP。

  • VARCHAR。

  • BINARY。

  • VARIANT、OBJECT 和 ARRAY。

  • GEOGRAPHY。

涉及其他类型的值(如 FLOAT、GEOMETRY)的查询不会受益。

支持的谓词类型

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

其他潜在改进

搜索优化还可以提高使用 JOIN 的视图和查询的性能。

视图

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

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

联接

搜索优化服务不会直接提高联接的性能。但是,它可以提高在联接之前从任一表中筛选行的性能。当表启用了搜索优化并且谓词是选择性时,(如 支持的谓词类型 部分所述),这种改进就会出现。

两个表都不需要启用搜索优化。使用搜索优化的决定是为每个表单独做出的。

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

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

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

  • 外部表。

  • 动态表。

  • 物化视图。

  • 使用 COLLATE 子句 定义的列。

  • 列连接。

  • 分析表达式。

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

    尽管搜索优化支持对常量值进行隐式和显式强制转换的谓词,但不支持对实际表中的值进行强制类型转换的谓词(从 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 的查询的性能,因为搜索优化仅适用于活动数据。

语言: 中文