Django cursor.execute(QUERY)比在postgres数据库中运行查询要慢得多

时间:2012-09-24 15:42:31

标签: python django performance postgresql

我在运行{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在全局无效,如果我在函数中设置内存,则调用是及时的。我想在配置文件中设置它可以全局工作。

1 个答案:

答案 0 :(得分:1)

如果“原位”查询和psql查询之间的时间差异很大,那么第一个也是常见的嫌疑是:如果框架使用预处理语句,那么你必须使用预处理语句检查psql中的时序。例如:

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

如果execute的时间与您的原位查询位于同一个球场,那么您可以explainexplain analyse execute行。

如果时间不在同一个球场,你必须寻找别的东西。