我在运行{integer, boolean, integer, varchar(255), varchar(255), bigint, text}
的数据库中完成了一个postgresql查询,在大约 70ms 中返回120行psql
。
将python / django与django.db.connection.cursor.execute()
一起使用,在同一台计算机上运行 10s 。
我已经尝试将所有行放入一个数组中,并且单个字符串(18k个字符,但只返回前500个字符需要相同的时间),因此只返回了一行但没有增益。
关于为什么在python和db中运行查询会出现如此剧烈的减速的任何想法?
修改
我不得不增加work_mem以使函数在psql中及时运行。其他函数/查询没有显示相同的模式,psql和python之间的区别只有几毫秒。
修改
将work_mem减少到1MB会在psql和django shell中显示相似的数字。可能是django没有按照work_mem中的内存设置进行操作吗?
修改
唉。问题是psql中设置的work_mem在全局无效,如果我在函数中设置内存,则调用是及时的。我想在配置文件中设置它可以全局工作。
答案 0 :(得分:1)
如果“原位”查询和psql查询之间的时间差异很大,那么第一个也是常见的嫌疑是:如果框架使用预处理语句,那么你必须使用预处理语句检查psql中的时序。例如:
prepare foo as select * from sometable where intcolumn = $1;
execute foo(42);
如果execute
的时间与您的原位查询位于同一个球场,那么您可以explain
和explain analyse
execute
行。
如果时间不在同一个球场,你必须寻找别的东西。