2016-11-28 79 views
3

我正在使用django,並且正在運行帶有210萬條記錄的postgresql數據庫。我有一個複雜的查詢需要20秒運行,並且需要很長的時間,因爲在查詢內部有一個合計count()函數,最終計算150萬條記錄。不得不等待20秒我的應用程序不能接受。如何提高此django ORM查詢的性能?

Django的ORM「查詢」如下:

WebRequest.objects.values('FormUrl', 'Request__Platform','Request__Ip').annotate(total=Count('Request__Ip')).order_by('-total')[:10] 

我試着用表的索引,但這幾乎不降低延遲。

現在我正在考慮將數據保存在表中,並且通過pgadmin/cronjob/task scheduler每隔一小時重新生成一次表。

drop table if exists <table> tbl; select into <tabel> tbl from query; 

我確實覺得這是一個馬虎的修復,並假設必須有一個更好的方法來減少時間。

有沒有更好的方法,或者你們認爲這是一個可接受的解決方案?

+1

有什麼事情可以先篩選下來的記錄註解?處理這些記錄總是需要一些時間 – Sayse

回答

0

如果你不需要確切的數量,你可以嘗試使用postgresql統計數據而不是計數。這裏檢查的更詳細的exaplanation https://wiki.postgresql.org/wiki/Count_estimate

這就需要使用原始的查詢,而不是ORM,但是這是去了很多性能相關的問題的方式