通过搜索优化加速联接查询

搜索优化服务可以提高联接查询的性能,这些查询在联接的构建端具有少量非重复值。

例如,搜索优化服务可以提高以下类型联接的性能:

  • 假设 products 表包含每个产品的行,而 sales 表包含每个产品销售的行。products 表包含较少的行数且表的大小不如 sales 表。要查找特定产品的所有销售,您需要将 sales 表(较大表)与 products 表(较小表)联接起来。因为 products 表很小,所以联接的构建端有少量非重复值。

    备注

    在数据仓库中,较大的表通常称为 事实表 (link removed)。较小的表则称为 维度表 (link removed)。在联接中,本主题的其余部分使用以上术语来指代大表和小表。

  • 假设 customers 表包含每个客户的行,而 sales 表包含每个销售的行。这两个表都很大。要查找特定客户的所有销售记录,您需要将 sales 表(探测端)与 customers 表(构建端)联接起来,并使用筛选器,这样在联接的构建端上有少量非重复值。

本主题内容:

启用搜索优化服务以提高联接的性能

要使搜索优化服务提高联接的性能,请向联接的探测端上的表中 添加搜索优化。该表通常是一个在联接查询中未经筛选的大表,例如事实表。

为了利用搜索优化,请确保联接的构建端有少量非重复值,这要么是因为它是一个小的维度表,要么是因为选择性筛选器。查询的搜索优化成本与在联接的构建端必须查找的非重复值的数量成比例。如果这个数字太大,Snowflake 可能会决定不使用搜索访问路径,而是使用常规表访问路径。

支持的联接谓词

搜索优化服务可以通过以下类型的联接谓词来提高查询的性能:

  • 格式为 probe_side_table.column = build_side_table.column 的相等谓词。

  • 谓词的构建端操作数上的转换(例如,字符串连接、加法等)。

  • 多个相等谓词的连接词 (AND)。

支持的查询示例

本节展示了可以从搜索优化中受益的联接查询示例。

示例:简单的相等谓词

以下是一个支持的查询示例,它使用简单的相等谓词作为联接谓词。此查询将名为 sales 的表与名为 customers 的表联接。 探测端表 sales 很大,并且启用了搜索优化。构建端表 customers 也很大,但由于 customer_id 列的选择性筛选器,该表中的输入很小。

SELECT sales.date, customer.name
  FROM sales JOIN customers ON (sales.customer_id = customers.customer_id)
  WHERE customers.customer_id = 2094;
Copy

示例:在维度端操作数上转换的谓词

以下查询将名为 sales 的事实表与名为 products 的维度表联接起来。 事实表很大,并启用了搜索优化。维度表很小。

此查询可以转换谓词的维度端操作数(例如,通过在联接条件中将值相乘),并可以从搜索优化中受益:

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.old_id * 100)
  WHERE product.category = 'Cutlery';
Copy

示例:跨多个列的谓词

在联接谓词跨越多个列的查询中,查询可以从搜索优化中受益。

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.id and sales.location = product.place_of_production)
  WHERE product.category = 'Cutlery';
Copy

示例:使用点查找筛选器和联接谓词的查询

在一个同时使用常规点查找筛选器和联接谓词的查询中,搜索优化服务可以提高两者的性能。在以下查询中,搜索优化服务可以改善 sales.location 点查找谓词以及 product_id 联接谓词:

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.id)
  WHERE product.category = 'Cutlery'
  AND sales.location = 'Buenos Aires';
Copy

限制

以下限制适用于搜索优化服务和联接查询:

  • 目前不支持联接谓词中的分离词 (OR)。

  • 目前不支持 LIKE、ILIKE 和 RLIKE 联接谓词。

  • 目前不支持 VARIANT 列上的联接谓词。

  • 目前不支持 EQUAL_NULL 相等谓词。

  • 搜索优化服务的当前限制 也适用于联接谓词。

语言: 中文