2016-11-28 4 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] 

Iは、テーブルインデックスを使用しようとしたが、これはほとんどの遅延を低減しません。

これでデータをテーブルに保存し、毎時pgadmin/cronjob/task schedulerでテーブルを再生成することを検討しています。

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

私はこれがちょっとした修正だと思って、時間を減らすためのよりよい方法が必要であると考えます。

これより優れたアプローチがありますか、またはこれを許容可能なソリューションとみなしていますか?

+1

前にレコードを絞り込むことができものはあります注釈?レコードの量を扱うことは、いつも時間がかかるでしょう – Sayse

答えて

0

正確なカウントが必要ない場合は、カウントを行う代わりにpostgresqlの統計を使用してみることができます。これは代わりに、ORMの生のクエリを使用して必要となるhttps://wiki.postgresql.org/wiki/Count_estimate

より詳細なexaplanationはこちらでチェックし、それがパフォーマンスに関連する問題の多くのために行くための方法だ

関連する問題