关于在 Python 里执行 Sql 速度慢的问题,求帮助

2018-05-11 10:30:55 +08:00
 zhangjiabin1010
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,
t_ply_base@linkzysyscard.regress.rdbms.dev.us.oracle.com 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,
t_edr_base@linkzysyscard.regress.rdbms.dev.us.oracle.com b,
t_ply_base@linkzysyscard.regress.rdbms.dev.us.oracle.com 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;
6017 次点击
所在节点    Python
23 条回复
sujin190
2018-05-11 15:28:58 +08:00
如果是 buffer cursor 的话,那么 execute 阶段就已经完成数据加载到内存解析完成了吧
而且事实上 cx_oracle 是用 c 写的啊,和 python 语言性能并未有直接关系
试过 pymysql 纯 python 写的从 mysql 取出百万条数据也不是很慢的吧
zhangjiabin1010
2018-05-11 15:32:30 +08:00
@sujin190 感谢回复哈。找到原因了,是我的问题。可以看我的最后回复。
ioth
2018-06-01 10:08:41 +08:00
@zhangjiabin1010 改 sql 要小心,确实。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/453985

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX