使用查询见解提高性能

如果存在影响查询性能的条件,Snowflake 会提供有关这些条件的见解。每项见解都包含一条消息,其中解释了查询性能可能受到的影响,并为提高性能提供了一般性建议。

您可以通过查询 QUERY_INSIGHTS 视图 来访问这些见解。

以下各节提供有关查询见解的详细信息:

见解类型列表

:doc:` QUERY_INSIGHTS 视图 </sql-reference/account-usage/query_insights>` 提供的见解包括:

  • 关于检测到的条件及其可能对查询性能产生的影响的信息。

  • 关于产生该条件的查询部分的详细信息。

  • 如果该条件对性能产生负面影响,建议采取的下一步措施。

下表按类型 ID 列出了见解的类型。

类型 ID

见解

QUERY_INSIGHT_NO_FILTER_ON_TOP_OF_TABLE_SCAN

表扫描时未使用筛选器

QUERY_INSIGHT_INAPPLICABLE_FILTER_ON_TABLE_SCAN

筛选器不适用

QUERY_INSIGHT_UNSELECTIVE_FILTER

筛选器选择性低

QUERY_INSIGHT_FILTER_WITH_CLUSTERING_KEY

筛选器使用了群集密钥

QUERY_INSIGHT_SEARCH_OPTIMIZATION_USED

查询受益于搜索优化

QUERY_INSIGHT_JOIN_WITH_NO_JOIN_CONDITION

无联接条件的联接

QUERY_INSIGHT_NESTED_EXPLODING_JOIN

爆炸性联接(嵌套联接)

QUERY_INSIGHT_EXPLODING_JOIN

爆炸性联接(非嵌套)

QUERY_INSIGHT_REMOTE_SPILLAGE

远程溢出

表扫描时未使用筛选器

查询或子查询没有 WHERE 子句,这意味着该查询会扫描整个表,并且可能返回比预期更多的行。

为了提高性能,应添加 WHERE 子句以减少扫描的数据量。

筛选器不适用

WHERE 子句未筛选出任何行,这意味着查询可能扫描的数据量多于预期。

为了提高性能,应在 WHERE 子句中添加更具选择性的条件,或使现有条件更具选择性。

筛选器选择性低

WHERE 子句未显著减少行数,这意味着查询可能扫描的数据量多于预期。

筛选器不适用 见解不同,此见解表示 WHERE 子句筛选了一些行,但其选择性本可以更高。

为了提高性能,应在 WHERE 子句中添加更具选择性的条件,或使现有条件更具选择性。

筛选器使用了群集密钥

查询受益于对 表的群集密钥 进行筛选。

查询受益于搜索优化

查询受益于对已配置为 搜索优化 的列进行筛选。

无联接条件的联接

该联接缺少联接条件。结果是一个 交叉联接,返回所有可能的行组合。

为了减少该联接生成的行数,请指定一个或多个联接条件。

爆炸性联接(嵌套联接)

如果一个联接包含了至少一个其他联接的输出,那么它:ref:返回的行数会远远多于被联接的表中的实际行数 <label-exploding_join>。这可能表明子联接的联接条件存在问题。

为了防止联接生成的行数超过参与联接的表的行数,请为子联接添加或更改联接条件。此外,在子联接中使用的子查询中添加 WHERE 子句可能会减少返回的行数。

爆炸性联接(非嵌套)

两个数据集(例如表、视图或表函数调用的输出)的联接 返回的行数远多于参与联接的表中的行数。这可能表明联接条件存在问题。

为了防止联接生成的行数超过参与联接的表的行数,请添加或更改联接条件。此外,在此联接使用的子查询中添加 WHERE 子句可能会减少返回的行数。

远程溢出

该查询扫描的数据量超过了仓库的存储容量。结果,仓库将 数据溢出 到存储,从而减慢了查询的处理速度。

为防止此问题,请使用容量更大的仓库。如果无法使用更大的仓库,请修改查询以分批处理数据。

限制

  • 见解针对针对数据库执行并由仓库处理的 SQL 查询生成。

  • 以下情况不会生成见解:

    • 涉及安全对象的查询。

    • 针对混合表 (Unistore) 执行的查询。

    • 由本地应用程序生成的查询。

    • EXPLAIN 查询。

    • 重用结果 的查询。

语言: 中文