Redshift:简单查询导致嵌套循环联接

时间:2020-05-19 11:36:58

标签: sql amazon-redshift

我正在使用查询来获取针对给定queryid删除的行数:

select stl_delete.query,
       listagg(distinct svv_table_info.table,',')
from stl_delete
join svv_table_info on svv_table_info.table_id=stl_delete.tbl
where stl_delete.query=1090750
group by stl_delete.query

结果似乎正确。

当我跑步时:

选择事件,来自stl_alert_event_log的解决方案,其中query = pg_last_query_id();

event                              solution
================================== ======================================================
Nested Loop Join in the query plan Review the join predicates to avoid Cartesian products

首先,为什么会有嵌套循环?

如何在此处修复嵌套循环联接?通过互联网,解决方案是查询中存在的连接谓词。

即使我删除了listaggr和分组依据,我仍然看到该问题:

select stl_delete.query,
       svv_table_info.table
from stl_delete
join svv_table_info on svv_table_info.table_id=stl_delete.tbl
where stl_delete.query=1090750

1 个答案:

答案 0 :(得分:0)

系统视图svv_table_info很复杂,并且会收集许多有关您大部分未使用的表的信息。循环联接在此视图中,是生成深入表报告所必需的。

您的查询仅需要基于tableid的表的名称。有一个系统表可以保存此信息,并且可以更快地运行并且不会产生循环联接。 pg_class在名为oid的列中有tableid,在relname中有表名。 (仅供参考,如果从pg_class oid中选择*不会显示,则需要按名称指定)

或者您也可以只接受警报。就Redshift而言,这种循环联接并不是很大。