识别可从搜索优化中受益的查询¶
搜索优化可以提高许多查询的性能。本主题介绍搜索优化对哪些查询帮助最大,以及哪些查询 :ref:` 不会从中受益<label-search_optimization_limitations>`。
一般查询特征¶
对于具有以下特征的查询,搜索优化提高其性能的效果最佳:
查询涉及主群集键以外的一列或多列。
查询通常运行几秒钟或更长时间(在应用搜索优化之前)。在大多数情况下,搜索优化不会大幅提高执行时间在亚秒级的查询的性能。
查询筛选器操作访问的列中至少有一列具有 100,000 个或更多不同的值。
若要确定非重复值的数量,可以使用以下任一方法:
使用
APPROX_COUNT_DISTINCT
获取非重复值的近似数量:SELECT APPROX_COUNT_DISTINCT(column1) FROM table1;
使用
COUNT(DISTINCT <col_name>)
获取非重复值的实际数量:SELECT COUNT(DISTINCT c1), COUNT(DISTINCT c2) FROM test_table;
因为只需要非重复值数量的近似值,因此可以考虑使用
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)
涉及其他数据类型(例如 FLOAT 或 GEOMETRY)其他值的查询不会受益。
支持的谓词类型¶
搜索优化可以提高使用以下类型的谓词进行查询的性能:
排序规则支持¶
搜索优化可以提升在定义了 :ref:COLLATE子句 <label-collate_clause>
的列上执行查询的性能,具体效果取决于搜索方法:
当在使用
EQUALITY
搜索方法的列上 启用 搜索优化时,任何排序规则规范都可以使用。当在使用
FULL_TEXT
或SUBSTRING
搜索方法的列上启用搜索优化时,支持'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');
为表中两个列的相等谓词启用搜索优化:
ALTER TABLE search_optimization_collation_demo
ADD SEARCH OPTIMIZATION ON EQUALITY(en_ci_col, utf_8_col);
以下查询可以受益于搜索优化:
SELECT *
FROM search_optimization_collation_demo
WHERE utf_8_col = 'test_collation_2';
以下查询无法受益于搜索优化,因为它使用 COLLATE 函数更改了 utf_8_col
列的排序规则规范:
SELECT *
FROM search_optimization_collation_demo
WHERE utf_8_col COLLATE 'de-ci' = 'test_collation_2';
以下查询同样无法受益于搜索优化。根据 排序规则优先级,查询通过 COLLATE 函数对列 utf_8_col
列应用了 'de-ci'
排序规则。
SELECT *
FROM search_optimization_collation_demo
WHERE utf_8_col = 'test_collation_2' COLLATE 'de-ci';
视图的潜在改进¶
搜索优化服务可以间接提高视图(包括安全视图)的性能。如果视图的基表启用了搜索优化,并且查询对该表使用选择性谓词,则搜索优化服务可以在筛选行时提高性能。请参阅 支持的谓词类型。
并非视图中的所有表都需要启用搜索优化。每个表都会独立执行搜索优化。
无法从搜索优化中受益的查询¶
目前,搜索优化服务不支持浮点数据类型,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;
不支持以下谓词,因为对表列中的值使用了强制类型转换:
-- Unsupported predicate -- (where values in a VARCHAR column are cast to DATE) WHERE to_date(varchar_column) = '2020-01-01';
搜索优化服务考虑的是列的原始值,而不是强制类型转换后的值。因此,搜索优化服务不用于使用这些谓词的查询。
如前所述,此规则的例外情况是将表列中的 INTEGER 或 VARCHAR 值强制转换为 NUMBER 值。搜索优化服务确实支持这种类型的谓词:
-- Supported predicate -- (where values in a numeric column are cast to a string) WHERE cast(numeric_column as varchar) = '2'
搜索优化不会提高使用 Time Travel 的查询的性能,因为搜索优化仅适用于活动数据。