2012-09-24 107 views
1

我有一个PostgreSQL的查询返回的120行{integer, boolean, integer, varchar(255), varchar(255), bigint, text}运行查询慢得多在数据库中运行psql完成后约70ms的Django的cursor.execute(查询)比Postgres数据库

使用python/django与django.db.connection.cursor.execute()它需要10s在同一台机器上运行。

我试图把所有的行到一个数组,一个字符串(18K字,但只返回第500采用相同的时间),所以只有一个返回行,但没有收获。

任何想法,为什么会出现在从蟒蛇内,并在数据库运行查询这样的大幅放缓?

编辑

我不得不增加work_mem获得在PSQL及时运行的功能。其他函数/查询不显示相同的模式,psql和python之间的区别只有几毫秒。

编辑

砍伐work_mem到1MB显示PSQL和Django的外壳类似的数字。难道django不会在work_mem中设置的内存?

编辑

唉。问题是在psql中设置的work_mem在全局无效,如果我在函数中设置了内存,则该调用是及时的。我想在配置文件中设置它可以在全局工作。

+0

这是怎么测量的?还有什么是你的数据库设置(例如,他们说“本地主机”,或包括完整的主机名)?有关环境,连接,Django安装的任何其他细节? – Tadeck

+0

我在python中使用psql和timeit.Timer中的解释分析。我迄今为止运行的其他查询不显示此模式。服务器在本地运行,所以没有连接,例如localhost,环境是osx mountain lion,我使用的是django 1.3。 – parmenides

+0

它不应该这么慢......我们经常做的是比用那种时间附近没有地方更大的取... –

回答

1

如果“原位”查询和psql查询之间的时间相差太大,则第一和常规疑似是这样的:如果框架使用预处理语句,那么你就必须检查使用预处理语句太PSQL时机。例如:

prepare foo as select * from sometable where intcolumn = $1; 
execute foo(42); 

如果execute的时机是在同一个球场为您现场查询,那么你就可以explainexplain analyseexecute线。

如果定时不在你必须寻找别的同一个球场。

+0

即使查询已准备好,时序仍然相同。我创建了一个函数来运行它,但无论查询是否直接运行,结果都是相同的。 – parmenides