sql - POSTGRES - 子查询返回结果非常慢
问题描述
我有一个相当简单的查询,但它包含一个子查询。我想按顺序获取resource_id
通过过滤器的列表。ORDER BY DESC;
更多信息
基本上我们需要找到resource_id's
通过下面查询中提到的过滤器的列表,
SELECT rs.resource_id
FROM resource rs
WHERE (
SELECT rc.resource_id
FROM risk_child rc
WHERE rc.resource_id = rs.resource_id
AND rc.cloudaccount_id = rs.cloud_account_id
AND rs.reg_id= any(array[236])
AND rc.risk_level= any(array['high','low'])
AND rc.status = any(array['fail'])
AND rc.cloudaccount_id= any (array['4ZiCmwslbjhmRtHAOjLG'])
ORDER BY rc.id DESC
LIMIT 1
) = rs.resource_id
然后这些资源将被传递到另一个查询中,如此处所述:
SELECT
DISTINCT ON (rc.resource_id, rc.rule_id, s.id) MAX(rc.creationtime) as creationtime,
rc.resource_id,
rl.rule_tag,
s.service,
r.region,
rc.status,
rs.vpc_id,
rc.cloudaccount_id,
rc.organization_id,
rs.owner_id,
rc.description,
f.function_name,
g.group_name,
rc.risk_level,
rc.id,
rc.user_id,
rc.pro_id,
c.category_name,
rc.raw as rawResponse,
rs.res_ca_id,
rs.resource_name
FROM
risk_child rc,
resource rs,
rule rl,
service s,
region r,
function f,
g_by g,
category c
WHERE
rc.resource_id = rs.resource_id
AND rl.id = rc.rule_id
AND s.id = rs.ser_id
AND rs.reg_id = r.id
AND f.id = rc.function_id
AND c.id = rc.category_id
AND g.id = rc.group_id
AND rc.cloudaccount_id like any (array $ { modifiedCloudAccounts })
AND rc.organization_id = $ { orgId }
AND rc.rule_id > 0
AND rc.cloudaccount_id = rs.cloud_account_id
AND rs.resource_id like any (array $ { getResources }) $ { risk }
GROUP BY
rc.rule_id,
rc.creationtime,
rc.creationtime,
rc.resource_id,
rl.rule_tag,
rl.id,
s.service,
r.region,
rc.status,
rs.vpc_id,
rc.cloudaccount_id,
rc.organization_id,
rs.owner_id,
rc.description,
f.function_name,
g.group_name,
rc.risk_level,
rc.id,
rc.user_id,
rc.pro_id,
c.category_name,
rc.raw,
s.id,
rs.res_ca_id
ORDER BY
rc.resource_id,
rc.rule_id ASC;
问题 现在第一个查询返回结果非常慢,即使在索引结果后 5 - 6 秒。所以请记住第一个查询需要运行两次
- 一获取总行数(用于分页)
- 第二次获取resource_ids
我主要在我的应用程序中使用 NO - SQL,所以我对 SQL 查询相当陌生。任何帮助,将不胜感激。谢谢
解决方案
所以最后这件事适用于我的情况:
SELECT rs.resource_id
FROM resource rs
WHERE EXISTS (SELECT *
FROM risk_child rc
WHERE rc.resource_id = rs.resource_id
AND rc.cloudaccount_id = rs.cloud_account_id
AND rs.reg_id= any(array[236])
AND rc.risk_level= any(array['high','low'])
AND rc.status = any(array['fail'])
AND rc.cloudaccount_id= any (array['4ZiCmwslbjhmRtHAOjLG'])
)
基本上,正如我在帖子中解释的那样,我对 SQL 相当陌生,我没有在我的表中放置正确的索引,所以我必须添加以下索引以使查询更快
resource(resource_id, cloud_account_id)
risk_child(resource_id, cloudaccount_id)
这帮助我进一步提高了我的表现。
推荐阅读
- html - 为什么保证金不起作用
元素?
- email - 使用 GCP 发送和接收电子邮件
- python - 是否有必要在 python 中显式调用 super().__init__() ?
- python-3.x - 如何重置所有行和列数据uisng python gspread sheet
- r - 从 R 中的文本中提取数据框或表格
- java - 如何更改 API 请求?
- python - /admin/'set'对象的Django错误TypeError不可逆
- entity-framework - 如何在实体框架核心中获得最小的计数?
- java - JAVA /如何使用comletable-future进行异步回调?
- asp.net-mvc - 为什么我们在 VS 解决方案中保留 .min.js 文件,而优化 BundleCollection 会在运行时缩小它们?