2

実行中のデータベースで実行すると{integer, boolean, integer, varchar(255), varchar(255), bigint, text}、約70 ミリ秒で120 行を返す postgresql-query がありますpsql

同じマシンでpython/django を使用すると、実行に10 秒django.db.connection.cursor.execute()かかります。

すべての行を配列に入れてみましたが、単一の文字列 (18k 文字ですが、最初の 500 文字のみを返すのに同じ時間がかかります) が返されますが、ゲインはありません。

Python 内およびデータベース内からクエリを実行する際に、なぜこのような劇的な速度低下が発生するのかについてのアイデアはありますか?

編集

関数を psql でタイムリーに実行するには、work_mem を増やす必要がありました。他の関数/クエリは同じパターンを示しません。psql と python の違いはわずか数ミリ秒です。

編集

work_mem を 1MB に削減すると、psql と django シェルで同様の数値が示されます。django が work_mem に設定されたメモリを使用していない可能性がありますか?

編集

うーん。問題は、psql に設定された work_mem がグローバルに有効ではないことでした。関数にメモリを設定すると、呼び出しがタイムリーになります。構成ファイルでこれを設定すると、グローバルに機能すると思います。

4

1 に答える 1

1

「in situ」クエリと psql クエリのタイミングが大きく異なる場合、最初の通常の疑いは次のとおりです。フレームワークが準備済みステートメントを使用している場合は、準備済みステートメントを使用して psql でもタイミングを確認する必要があります。例えば:

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

のタイミングがexecuteその場でのクエリと同じ球場にある場合は、explainラインを作成できます。explain analyseexecute

タイミングが同じ球場にない場合は、別のものを探す必要があります。

于 2012-09-24T17:51:44.067 に答える