pg mysql join 性能_pgsql_sql查询效率优化

在pgsql中执行一个 5表 关联查询,效率比较差,问题定位

环境说明

5张外表,其中with 中的临时表总记录数比较大,共有 2 亿条记录,通过时间序模型提高查询速度

另外4张表 左表的记录非常小,最大的记录数不超过 1w 条

在没有做过任何调优的pgsql 中执行explain,会发现它的访问计划中包含很多的 nested loop join

Aggregate (cost=99723528.30..99723528.31 rows=1 width=0)

CTE f_acct_vchr_1_tmp-> Foreign Scan on hdmp_pri5_fdm_f_acct_vchr vo_1 (cost=0.00..99722420.16 rows=1 width=1448)

Filter: ((posting_dt>= '2015-12-01'::date) AND (posting_dt <= '2015-12-31'::date) AND (trans_no ~~ '301%'::text) AND(a

mt= 1000::double precision) AND ((posting_flg = 'Y'::text) OR (gl_acc_id = '99900'::text)))ForeignNamespace: hdmp_pri5_fdm.f_acct_vchr-> Nested Loop Left Join (cost=0.00..1108.15 rows=1 width=0)Join Filter: (vo.calc_trans_action =d3.trans_action_cd)-> Nested Loop Left Join (cost=0.00..902.53 rows=1 width=32)Join Filter: (vo.trans_action_cd =d2.trans_action_cd)-> Nested Loop Left Join (cost=0.00..696.92 rows=1 width=64)Join Filter: (vo.fund_tnl_cd =f1.prod_cd)-> Nested Loop Left Join (cost=0.00..360.10 rows=1 width=96)Join Filter: (vo.calc_unit_id =u1.calc_unit_id)-> Nested Loop Left Join (cost=0.00..352.15 rows=1 width=104)Join Filter: (vo.modl_id =d1.modl_id)-> Nested Loop Left Join (cost=0.00..336.84 rows=1 width=112)Join Filter: (vo.prod_cd =p.prod_cd)-> CTE Scan on f_acct_vchr_1_tmp vo (cost=0.00..0.02 rows=1 width=144)-> Foreign Scan on d_prod p (cost=0.00..336.22 rows=48 width=32)

Filter: (eff_flg= 'Y'::text)ForeignNamespace: hdmp_pri5_fdm.d_prod-> Foreign Scan on d_modl d1 (cost=0.00..13.36 rows=156 width=8)ForeignNamespa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在 PostgreSQL使用 `pg_size_pretty` 函数时出现错误,可能是因为该函数不在当前的数据模式中可用。你可以尝试通过以下两种方式解决问题: 1. 使用完全限定的函数名称:`pg_catalog.pg_size_pretty` 例如,将查询语句中的 `pg_size_pretty` 替换为 `pg_catalog.pg_size_pretty`。这将确保使用完整的函数路径,而不仅仅是函数名称。 ```sql SELECT pg_catalog.pg_size_pretty(pg_total_relation_size(current_database())) AS total_size, pg_catalog.pg_size_pretty(pg_database_size(current_database())) AS database_size; ``` 2. 切换到正确的数据模式 在 PostgreSQL 中,函数可以位于不同的模式中。如果 `pg_size_pretty` 函数位于其他模式中而不是默认的模式中,你需要切换到该模式才能使用它。 首先,可以通过以下查询语句查看函数所在的模式: ```sql SELECT proname, pronamespace::regnamespace AS schema FROM pg_proc WHERE proname = 'pg_size_pretty'; ``` 查询结果将显示函数 `pg_size_pretty` 的模式。然后,你可以使用以下命令切换到正确的模式: ```sql SET search_path TO schema_name; ``` 其中,`schema_name` 是函数所在的模式名称。切换到正确的模式后,你应该能够正常使用 `pg_size_pretty` 函数。 请注意,以上解决方法假设你具有足够的权限来执行这些操作。如果你没有足够的权限或者遇到其他问题,请联系数据管理员进行进一步的支持和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值