psycopg2 的损耗怎么这么大?

2017-07-06 15:23:27 +08:00
 ballshapesdsd
用的 postgresql 数据库,在 python 下用的 psycopg2 连接数据库。

select 一个大概 500 万行的表,加了索引。
在 python 下循环 10000 次,用 psycopg2 select,用了 6.20757 s。
在数据库里编写函数,直接 select 10000 次,只需要 0.074269 s。

这时间也差的太多了吧,直接差 100 倍的速度?

后来在 python 下循环 10000 次,直接 select 1 ;,用了 3.55476 s。平均一次就有 0.0003s。
这种空 select 居然有这么大损耗,简直忍不了啊。难道传输 sql 命令的损耗有这么大?有什么办法提高速度吗?
1646 次点击
所在节点    问与答
3 条回复
leeoo
2017-07-07 14:22:14 +08:00
题主把测试代码贴出来看下。或者试试用 pg8000 对比下性能怎么样。
ballshapesdsd
2017-07-07 14:44:02 +08:00
@leeoo

@profile
def aaa():
for i in range(10000):
sqlcmd='''select * from link_tbl where link_id=10360000000013'''
cur.execute(sqlcmd)
b=cur.fetchall()
aaa()

@profile
def bbb():
sqlcmd='''
CREATE OR REPLACE FUNCTION bbb()
RETURNS smallint
LANGUAGE plpgsql volatile
AS $$
DECLARE
node_id bigint;
i integer;
BEGIN
for i in 1..10000 loop
select s_node into node_id from link_tbl where link_id=10360000000013;
end loop;
return 1;
END;
$$;
select bbb();
'''
cur.execute(sqlcmd)
conn_str.commit()

bbb()

@profile
def ccc():
for i in range(10000):
sqlcmd='''select 10360000000013;'''
cur.execute(sqlcmd)
b=cur.fetchall()

ccc()
ballshapesdsd
2017-07-07 14:45:04 +08:00
现在问题解决了,我把整个数据表加载到内存里,用字典存起来,这样查询快很多,不过内存用了 7,8 个 g。

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

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

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

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

© 2021 V2EX