这是用Cprofile分析的代码执行情况,主要时间浪费在了执行语句 execute 上。
1
est 2018-05-11 10:34:28 +08:00
问题所在,多半是是一次性把数据载入内存的开销。
|
2
myyou 2018-05-11 10:38:12 +08:00 1
查询数据的游标 cursor 不要执行 cursor.fetchall()一次性取出数据,试试 for data in cursor 逐条去取数据,因为 cursor 是一个迭代器
|
3
zhangjiabin1010 OP @est 在 python 里 我测试: 只执行 sql 语句 curs.execute(sql) ,而不获取查询结果 速度同样很慢。请问下,只执行语句,不 fetchall,会占用很多内存吗?
|
4
zhangjiabin1010 OP @myyou 嗯,是的。我并没有 fetchall。只是 curs.execute(sql)。时间差异依然是那么大~
|
5
zhangsen1992 2018-05-11 11:05:37 +08:00
优化 sql 或者 strace -p 看卡在哪
|
6
hcymk2 2018-05-11 11:10:13 +08:00
有完整的 python 代码么?
|
7
zhangjiabin1010 OP @hcymk2 就是很简单的连数据库流程,
conn = cx_Oracle.connect('xxxxx/[email protected]:xx/xxx') curs = conn.cursor() query_sql ="sql 语句" curs.execute(query_sql) #query_data = curs.fetchll() #print(query_data) curs.close() conn.close() |
8
est 2018-05-11 12:02:03 +08:00
@zhangjiabin1010 就是 fetchall 卡住了。
|
9
ioth 2018-05-11 12:07:31 +08:00
不能在程序里面,多表联合查询用一个 sql 语句,能出来就奇怪了,要建立数据模型
和 pl/sql 比较速度没有意义 你用哪种语言都是这样结局,除非 foxpro 或者 powerbuilder 这样本身就是数据库为核心的开发系统 可以什么都不管塞进去 sql |
10
zhangjiabin1010 OP @est 您看下我补发的图片,从反映上看时间 应该还是浪费在了 execute 的执行上
|
11
est 2018-05-11 12:57:05 +08:00
@zhangjiabin1010 ok。那就不清楚了。
|
12
zhangjiabin1010 OP @ioth 不能用一个 sql 语句。是不能执行还是速度慢啊!我从测试上来看,数据量少的话,还是能获取执行结果的。再请问 如果不写在一个 sql 里的话。除了拆分 SQL 语句 还有什么好的方案可以实现吗?
|
13
aliipay 2018-05-11 13:05:51 +08:00
看了这么长的 sql 语句,表示我不想说任何话
|
14
lieh222 2018-05-11 14:29:25 +08:00
抓个包用 wireshark 看看吧,应该可以解析这个协议
|
15
bxtx999 2018-05-11 14:42:14 +08:00
1. python connector 的问题
2. 游标(参考二楼) 使用 for row in cur: 替代 cur.fetchall() 参考: https://stackoverflow.com/questions/26783735/python-5x-slower-than-perl-mysql-query |
16
zhangjiabin1010 OP @bxtx999 和第二条应该没关系,我测试过第二种方案,效果一样。可能是 connector 的原因。但是我用 pandas 直接连接数据库执行语句,效果和用 cx_oracle 一样慢 。所以现在我也不是很清楚瓶颈卡在哪里了。您有什么好的提议吗?
|
17
whx20202 2018-05-11 14:59:20 +08:00
你把 SQL 在数据库节点上执行,输出的 9W 行,直接重定向一下文件,看看用多久?
现在你还没能够证明 SQL 本身很快啊 |
19
zhangjiabin1010 OP @whx20202 感谢您的回复~刚才已经找到问题所在啦,原因是我错误的打乱了 sql 语句的格式造成的问题。他们给我 sql 语句之后,我用 双引号 "sql 语句" 存放,然后对缩进格式更改过。最后我直接使用 三引号代码块 """sql 语句""" 放 原格式语句 就好啦、
|
20
zhangjiabin1010 OP 原因已经找到:我错误的打乱了 sql 语句的格式造成的问题。他们给我 sql 语句之后,我用 双引号 "sql 语句" 存放,然后对缩进格式更改过。最后我直接使用 三引号代码块 """sql 语句""" 放 原格式语句。可能是某些空格
或者缩进单位影响了 sql 的执行效率。 经验 :大段 SQL 语句要小心更改。最好直接使用三引号代码块 结贴追加补图! |
21
sujin190 2018-05-11 15:28:58 +08:00
如果是 buffer cursor 的话,那么 execute 阶段就已经完成数据加载到内存解析完成了吧
而且事实上 cx_oracle 是用 c 写的啊,和 python 语言性能并未有直接关系 试过 pymysql 纯 python 写的从 mysql 取出百万条数据也不是很慢的吧 |
22
zhangjiabin1010 OP @sujin190 感谢回复哈。找到原因了,是我的问题。可以看我的最后回复。
|
23
ioth 2018-06-01 10:08:41 +08:00
@zhangjiabin1010 改 sql 要小心,确实。
|