我有一个postgresql查询,当在运行{integer, boolean, integer, varchar(255), varchar(255), bigint, text}
的数据库中完成时,它在大约70ms内返回120行psql
。
使用python/django和django.db.connection.cursor.execute()
在同一台机器上运行需要10秒。
我试着把所有的行放入一个数组中,一个字符串(18k个字符,但是只返回前500个字符需要相同的时间),所以只返回一行,但没有任何收获。
有什么想法可以解释为什么在python和db中运行查询的速度会显著减慢?
编辑
为了使函数在psql中及时运行,我不得不增加工作内存。其他函数/查询不显示相同的模式,psql和python之间的差别只有几毫秒。
编辑
将work-mem减少到1MB在psql和django shell中显示了类似的数字。是不是django不按工作记忆去做?
编辑
呃。问题是psql中的work_mem设置在全局上无效,如果我在函数中设置内存,则调用是及时的。我想在配置文件中设置这个可以在全局范围内工作。
最佳答案
如果“原位”查询和psql查询之间的时间相差很大,那么第一个常见的问题是:如果框架使用了prepared语句,那么您还必须使用prepared语句检查psql中的时间。例如:
prepare foo as select * from sometable where intcolumn = $1;
execute foo(42);
如果
execute
的计时与原位查询在同一个范围内,则可以explain
和explain analyse
行。如果时机不一样,你就得另谋高就。