2

我有一个 postgresql 查询,当在运行的数据库中完成时,它会{integer, boolean, integer, varchar(255), varchar(255), bigint, text}在大约70 毫秒psql内返回 120 行。

在同一台机器上使用 python/djangodjango.db.connection.cursor.execute()需要10 秒才能运行。

我尝试将所有行放入一个数组和一个字符串(18k 个字符,但只返回前 500 个字符需要相同的时间),所以只返回一行但没有增益。

关于为什么在 python 和 db 中运行查询会出现如此显着的减速的任何想法?

编辑

我不得不增加 work_mem 以使函数在 psql 中及时运行。其他函数/查询不显示相同的模式,psql 和 python 之间的差异只有几毫秒。

编辑

将 work_mem 减少到 1MB 在 psql 和 django shell 中显示相似的数字。难道是django没有按照work_mem中设置的内存?

编辑

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

4

1 回答 1

1

如果“原位”查询和 psql 查询之间的时间差异很大,那么第一个也是通常的怀疑是:如果框架使用准备好的语句,那么您也必须使用准备好的语句检查 psql 中的时间。例如:

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

如果时间与您的现场查询在execute同一个球场,那么您可以explain和线路。explain analyseexecute

如果时间不在同一个球场上,您必须寻找其他东西。

于 2012-09-24T17:51:44.067 回答