Amazon Redshift 何时使用 AQUA 来运行查询? - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon Redshift 何时使用 AQUA 来运行查询?

对于扫描表的每个查询,Amazon Redshift 将确定扫描操作是发送到 AQUA 还是在 Amazon Redshift 集群本地运行。当扫描和聚合操作至少包含一个包含 AQUA 支持的 LIKE 或 SIMILAR TO 表达式的谓词时,它们将被发送到 AQUA。如果将扫描操作发送到 AQUA,则整个操作在 AQUA 上运行(不仅仅是 LIKE 或 SIMILAR TO 处理)。

例如,以下查询包含发送到 AQUA 的谓词 str1 LIKE 'a%'num1 > 10

select num2 from tbl where str1 LIKE 'a%' and num1 > 10 GROUP BY num2;

在此示例中,AQUA 将扫描表 tbl,按谓词进行筛选,按 num2 对结果进行分组,然后将结果返回至 Amazon Redshift。

在以下示例中,Amazon Redshift 确定查询的哪些部分最好在 AQUA 中运行,哪些部分在 Amazon Redshift 集群本地运行。在这种情况下,customer_name 列上有用于筛选返回的行的 LIKE 谓词。扫描操作被发送到 AQUA 以运行该部分查询。Amazon Redshift 仅接收扫描的结果,然后 Amazon Redshift 将使用该结果在本地执行联接并完成查询。

select c.customer_name, p.prod_name, sum(revenue) from orders o join customers c ON c.id = o.customer_id join products p ON p.id = o.product_id where c.customer_name LIKE ‘%Amazon%Web%’ order by sum(revenue);

有关 LIKE 和 SIMILAR TO 的更多信息,请参阅 Amazon Redshift 数据库开发人员指南中的 LIKESIMILAR TO

AQUA 的注意事项

AQUA 目前不支持以下类型的 SQL 查询。包含这些查询的查询会在您的 Amazon Redshift 集群本地运行。

  • 执行写入操作的查询,如 INSERT、UPDATE、DELETE、CREATE TABLE AS、COPY 和 UNLOAD。有关更多信息,请参阅 Amazon Redshift 数据库开发人员指南中的 SQL 命令

  • 没有谓词的 SELECT 查询,例如以下内容。

    select * from tbl1
  • 扫描中 Python 用户定义的函数 (UDF),包括对 Python UDF 定义的复杂视图进行扫描。

  • 在 LIKE 和 SIMILAR TO 谓词中使用以下元字符的查询:

    • LIKE 表达式中的非常量正则表达式文本。

    • 两种备选方案之一,例如以下内容。

      SIMILAR TO '%(cat|dog)%'
    • VARCHAR 列中单字符通配符的多个实例,例如以下内容。

      SIMILAR TO 'ab.cd.ef'
    • 匹配字符串中的 Unicode 转义序列、十六进制字符和八进制字符,例如以下内容。

      SIMILAR TO '%ab\uc382'
      SIMILAR TO '%ab\U0000c382'
      SIMILAR TO '%ab\x88'
      SIMILAR TO '%ab\127'
    • 重复元字符,如“*”、“+”、“?”、{m, n} 应用于 () 内的模式和多字节字符上,例如以下内容。

      SIMILAR TO 'abc(def)*'
      SIMILAR TO 'abcʥ+'
    • 括号表达式中的多字节字符 [...],例如以下内容。

      SIMILAR TO 'abc[ʥde]'.
  • 字符串函数(如 LOWER、UPPER、LEFT、RIGHT)应用于 LIKE 或 SIMILAR TO 扫描的输出所处的查询。例如,以下摘录显示了 LOWER 函数。

    LOWER(a) LIKE "%cat%"

    相反,请尝试重写查询以使用不区分大小写的 ILIKE 而不带 LOWER。

    ILIKE "%cat%"

如何确定是否使用了 AQUA

下面的 SQL 显示了在 AQUA 上运行的 SVL_QUERY_SUMMARY 的查询执行分段。

select * from svl_query_summary where label ~ 'Aqua' limit 100;

如果您拥有超级用户访问权限,还可以联接 STL_QUERYSTL_QUERYTEXT 视图以查看与 AQUA 运行的查询相对应的 SQL 语句。由 EXPLAIN 语句生成的解释计划不会显示查询是否使用了 AQUA。