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 数据库开发人员指南中的 LIKE 和 SIMILAR 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_QUERY 和 STL_QUERYTEXT 视图以查看与 AQUA 运行的查询相对应的 SQL 语句。由 EXPLAIN 语句生成的解释计划不会显示查询是否使用了 AQUA。