2012-09-24 103 views
1

我有一個PostgreSQL的查詢返回的120行{integer, boolean, integer, varchar(255), varchar(255), bigint, text}運行查詢慢得多在數據庫中運行psql完成後約70ms的Django的cursor.execute(查詢)比Postgres數據庫

使用python/django與django.db.connection.cursor.execute()它需要10s在同一臺機器上運行。

我試圖把所有的行到一個數組,一個字符串(18K字,但只返回第500採用相同的時間),所以只有一個返回行,但沒有收穫。

任何想法,爲什麼會出現在從蟒蛇內,並在數據庫運行查詢這樣的大幅放緩?

編輯

我不得不增加work_mem獲得在PSQL及時運行的功能。其他函數/查詢不顯示相同的模式,psql和python之間的區別只有幾毫秒。

編輯

砍伐work_mem到1MB顯示PSQL和Django的外殼類似的數字。難道django不會在work_mem中設置的內存?

編輯

唉。問題是在psql中設置的work_mem在全局無效,如果我在函數中設置了內存,則該調用是及時的。我想在配置文件中設置它可以在全局工作。

+0

這是怎麼測量的?還有什麼是你的數據庫設置(例如,他們說「本地主機」,或包括完整的主機名)?有關環境,連接,Django安裝的任何其他細節? – Tadeck

+0

我在python中使用psql和timeit.Timer中的解釋分析。我迄今爲止運行的其他查詢不顯示此模式。服務器在本地運行,所以沒有連接,例如localhost,環境是osx mountain lion,我使用的是django 1.3。 – parmenides

+0

它不應該這麼慢......我們經常做的是比用那種時間附近沒有地方更大的取... –

回答

1

如果「原位」查詢和psql查詢之間的時間相差太大,則第一和常規疑似是這樣的:如果框架使用預處理語句,那麼你就必須檢查使用預處理語句太PSQL時機。例如:

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

如果execute的時機是在同一個球場爲您現場查詢,那麼你就可以explainexplain analyseexecute線。

如果定時不在你必須尋找別的同一個球場。

+0

即使查詢已準備好,時序仍然相同。我創建了一個函數來運行它,但無論查詢是否直接運行,結果都是相同的。 – parmenides