2011-08-10 48 views
4

嗨,我有很多,我從查詢中獲取對象時,查詢集尚未進行評估,當我通過鏈表類到分頁程序反對它花了14秒返回分頁程序的對象,這是因爲它正在評估花費時間的所有列表中的對象(可能是db)。Django的視圖響應時間發出

我用力評估查詢集將它發送到分頁程序對象之前:

ds_objects = list(ds_objects) 

猜猜現在什麼分頁了0.0秒在返回的對象,但問題依然存在,現在所有的時間採取ds_objects =名單(ds_objects ),我如何有效地做到這一點,使我的觀點響應時間減少到2或3秒?我還沒有發現任何最好的解決辦法:■

+0

這是查詢是返回我的對象​​..可能是我沒有有效地進行查詢?? :( 'ds_objects = tbl_action_log.objects.using(DB_NAME).select_related(深度= 1).values( 「TicketID」, 「ActionLogID」, 「DSID」, 「主機」, 「IP」, 「時間戳」,「EndTimeStamp 「,」RetryCount「,」ActionID__ActionCode「,」ErrorCodeID__ErrorCode「)。order_by(' - TicketID','-ActionLogID')' –

+0

我希望分頁程序(當傳遞查詢時)運行一個單獨的數據庫請求, ();不知道這是什麼在你的情況下做的。另外,我在使用.only()時看到了一些奇怪的性能問題,這在使用.values()(或.values()和某些參數) - 所以你可以試試這個。 – HoverHell

回答

1

我的猜測是,連接(這樣select_related),都不查詢速度很重要。無論如何,當你做一個values()查詢時,你並不需要select_related,因爲唯一的字段是指定爲0​​參數的字段,而且它們都由JOIN檢索。

,看看它爲什麼需要這麼長時間,你可以做到以下幾點:

打印出了「原始SQL」與

print tbl_action_log.objects.order_by('-TicketID', '-ActionLogID').query 

修改它(它實際上不是SQL,但它應該是附近足夠)可以在SQL客戶端運行,就像django自己的manage.py dbshell一樣。

執行它,注意時間。然後執行EXPLAIN ...(將查詢放在網點中),您可能會看到一些「全表掃描」消息

向受影響的列上的數據庫表添加適當的索引,然後再次執行查詢。該指數可能會是這樣的:

CREATE INDEX idx_action_log_on_tkid_logid ON tbl_action_log (TicketID, ActionLogID); 

當你滿意的指標,存儲其創作條命令在 文件app/sql/modelname.sql,這將創建任何新部署的索引。

+0

完美的解決方案,完全解決我的djanguine問題,謝謝。查詢時間現在減少到只有0.3 –