在大型数据库中高效计数查询?

时间:2015-03-11 15:05:54

标签: django postgresql

我有一个带有Postgres 9.3后端的Django 1.7应用程序。我的数据库有大约400万行支出项目,每个项目都有一个关联的组织。模型如下:

class Organisation(models.Model):
    code = models.CharField(max_length=9, primary_key=True, db_index=True)
    name = models.CharField(max_length=200)

class SpendingItem(models.Model):
    organisation = models.ForeignKey(Organisation)
    total_items = models.IntegerField() ... plus other info attached

我现在正在为每个组织编写一个视图,该视图返回附加的支出项目总数。对于大的结果集,它非常慢,例如返回1m结果的查询超过150秒。

这是视图代码:

def organisation(request, org_code):
    org = get_object_or_404(Organisation, code=org_code)
    num_spending_items = SpendingItem.objects.filter(organisation=org).count()
    context = {
        'organisation': org,
        'num_spending_items': num_spending_items
    }
    return render(request, 'organisation.html', context)

我一直在阅读Postgres documentation on slow counting,但我想知道我能做些什么简单,例如使用索引加快速度,或者我是否需要回退到原始SQL并使用文档中提到的一些技术。或预先生成结果并将其存储在其他地方。

我的消费项目数据库表已经有以下索引,虽然我一直在用COPY语句加载数据,所以我不知道它们是否是最新的(并且不知道我是怎么说的):

=# \d frontend_spendingitem;
                                       Table "public.frontend_spendingitem"
      Column       |          Type           |                             Modifiers
-------------------+-------------------------+--------------------------------------------------------------------
 id                | integer                 | not null default nextval('frontend_spendingitem_id_seq'::regclass)
 total_items       | integer                 | not null
 organisation_id   | character varying(9)    | not null
Indexes:
    "frontend_spendingitem_pkey" PRIMARY KEY, btree (id)
    "frontend_spendingitem_a69d813a" btree (organisation_id)
    "frontend_spendingitem_organisation_id_4619f68f65c49a8_like" btree (organisation_id varchar_pattern_ops)
Foreign-key constraints:
    "front_organisation_id_4619f68f65c49a8_fk_frontend_organisation_code" FOREIGN KEY (organisation_id) REFERENCES frontend_organisation(code) DEFERRABLE INITIALLY DEFERRED

0 个答案:

没有答案