ps:刚才的主题没编辑完呢,就发出去了。重发一下。
一条多表联合查询 Sql 语句,在 PL/SQL 里执行需要 100 秒,数据有 8 万条。在 Python 里用 CX_Oracle 里执行这条语句,需要很久。我都没等完过,最长的一次等了半小时。后来用 Pandas 连接数据库查询,速度同样很慢,后来我缩小了选择范围。数据量大概有 3000 条左右,执行时间对比如下:
PL/SQL 15 秒
Python cx_oracle 4 分钟 20 秒
python pandas 5 分钟
所以请教有过此问题经验的大佬给解答一下,是什么造成的差异。我该如何调整呢 感谢!!!
PS:优化 SQL 语句我估计不太可行,语句是需求那边直接给的。如果要优化也是需求那边的问题。我的主要疑问是:
#补充 SQL 语句如下:
select d.cplyno, NVL(SUM(NVL(d.n_sum, 0)), 0)
from (SELECT NVL(N_GET_PRM, 0) n_sum, a.c_ply_no cplyno
FROM T_FIN_PLYEDR_COLDUE@linkzysyscard.regress.rdbms.dev.us.oracle.com A,
[email protected] b
WHERE a.c_cha_cde in ('55001247','55020299000760')
and a.c_edr_no is null
and a.c_ply_no = b.c_ply_no
and b.cardno='0650mt'
/* and a.c_prod_no like '0650mt'|| '%'*/
and exists
(SELECT C_DPT_CDE
FROM t_department
WHERE c_dpt_cde = a.c_dpt_cde
and c_company_cde in
(SELECT c_company_cde
FROM t_department
WHERE C_DPTACC_CDE = '55'))
and b.t_udr_date BETWEEN
to_date('2017-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
to_date('2017-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
and b.c_b2b_udr_mrk <> 'X'
and N_GOT_PRM = 0
and T_CHARGE_TM is null
union all
SELECT NVL(N_GET_PRM, 0) n_sum, a.c_edr_no cplyno
FROM T_FIN_PLYEDR_COLDUE@linkzysyscard.regress.rdbms.dev.us.oracle.com A,
[email protected] b,
[email protected] c
WHERE a.c_cha_cde in ('55001247','55020299000760')
and a.c_edr_no is not null
and a.c_edr_no = b.c_edr_no
and b.c_ply_no=c.c_ply_no
/* and a.c_prod_no like '0650mt' || '%'*/
and exists
(SELECT C_DPT_CDE
FROM t_department
WHERE c_dpt_cde = a.c_dpt_cde
and c_company_cde in
(SELECT c_company_cde
FROM t_department
WHERE C_DPTACC_CDE = '55'))
and b.t_udr_date BETWEEN
to_date('2017-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
to_date('2017-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
and b.c_b2b_udr_mrk <> 'X'
and N_GOT_PRM = 0
and c.cardno='0650mt'
and T_CHARGE_TM is null) d
group by d.cplyno
order by d.cplyno;
一条多表联合查询 Sql 语句,在 PL/SQL 里执行需要 100 秒,数据有 8 万条。在 Python 里用 CX_Oracle 里执行这条语句,需要很久。我都没等完过,最长的一次等了半小时。后来用 Pandas 连接数据库查询,速度同样很慢,后来我缩小了选择范围。数据量大概有 3000 条左右,执行时间对比如下:
PL/SQL 15 秒
Python cx_oracle 4 分钟 20 秒
python pandas 5 分钟
所以请教有过此问题经验的大佬给解答一下,是什么造成的差异。我该如何调整呢 感谢!!!
PS:优化 SQL 语句我估计不太可行,语句是需求那边直接给的。如果要优化也是需求那边的问题。我的主要疑问是:
#补充 SQL 语句如下:
select d.cplyno, NVL(SUM(NVL(d.n_sum, 0)), 0)
from (SELECT NVL(N_GET_PRM, 0) n_sum, a.c_ply_no cplyno
FROM T_FIN_PLYEDR_COLDUE@linkzysyscard.regress.rdbms.dev.us.oracle.com A,
[email protected] b
WHERE a.c_cha_cde in ('55001247','55020299000760')
and a.c_edr_no is null
and a.c_ply_no = b.c_ply_no
and b.cardno='0650mt'
/* and a.c_prod_no like '0650mt'|| '%'*/
and exists
(SELECT C_DPT_CDE
FROM t_department
WHERE c_dpt_cde = a.c_dpt_cde
and c_company_cde in
(SELECT c_company_cde
FROM t_department
WHERE C_DPTACC_CDE = '55'))
and b.t_udr_date BETWEEN
to_date('2017-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
to_date('2017-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
and b.c_b2b_udr_mrk <> 'X'
and N_GOT_PRM = 0
and T_CHARGE_TM is null
union all
SELECT NVL(N_GET_PRM, 0) n_sum, a.c_edr_no cplyno
FROM T_FIN_PLYEDR_COLDUE@linkzysyscard.regress.rdbms.dev.us.oracle.com A,
[email protected] b,
[email protected] c
WHERE a.c_cha_cde in ('55001247','55020299000760')
and a.c_edr_no is not null
and a.c_edr_no = b.c_edr_no
and b.c_ply_no=c.c_ply_no
/* and a.c_prod_no like '0650mt' || '%'*/
and exists
(SELECT C_DPT_CDE
FROM t_department
WHERE c_dpt_cde = a.c_dpt_cde
and c_company_cde in
(SELECT c_company_cde
FROM t_department
WHERE C_DPTACC_CDE = '55'))
and b.t_udr_date BETWEEN
to_date('2017-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
to_date('2017-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
and b.c_b2b_udr_mrk <> 'X'
and N_GOT_PRM = 0
and c.cardno='0650mt'
and T_CHARGE_TM is null) d
group by d.cplyno
order by d.cplyno;

