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

hgc7kmma  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(295)

我正在使用查询获取给定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中选择event,solution,其中query=pg_last_query_id();

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

首先,为什么会有嵌套循环?
如何修复这里的嵌套循环连接?通过internet,解决方案是查询中的连接 predicate 。
即使我删除了listagr和group by,我仍然看到问题:

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
nszi6y05

nszi6y051#

系统视图svv\u table\u info非常复杂,它收集了很多关于表的信息,而这些表中的大多数都没有使用。循环联接在这个视图中,需要它来生成深入的表报告。
您的查询只需要基于tableid的表名。有一个系统表保存此信息,它运行得更快,不会产生循环联接。pg\u类在名为oid的列中有tableid,在relname中有表名(仅供参考如果您从pg中选择*u类oid将不会显示,您需要按名称指定它)
或者你可以接受警报。这个循环连接在红移术语中不是很大。

相关问题