2014-01-17 185 views
0

我做了一个模块,它解析xml文件并更新或在django数据库(pgsql)中创建数据。Django - 非常慢的查询

当数据导入/更新完成时,我尝试更新我的对象的一些元数据。

我使用django-mptt树结构和我的元数据更新是用于创建我的对象之间的这种结构。

这真的非常慢,需要大约1秒来填充来自其他外键的数据。

如何对此进行优化?

for index, place in enumerate(Place.objects.filter(type=Place.TOWN, town_id_equal=True)): 
    place.parent = place.second_order_division 
    place.save() 

    print index 
    if index % 5000 == 0: 
     transaction.commit() 
transaction.commit() 

transaction.set_autocommit(False) 
for index, place in enumerate(Place.objects.filter(type=Place.TOWN, town_id_equal=False, 
                parent__isnull=True)): 

    place.parent = Place.objects.get(town_id=place.town_id_extra) 
    place.save() 

    print index 
    if index % 5000 == 0: 
     transaction.commit() 
transaction.commit() 


class Place(MPTTModel): 
    first_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name=u"Województwo", 
              related_name="voivodeships") 
    second_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name=u"Powiat", 
               related_name="counties") 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

编辑:

我更新的第一个功能是这样的:

transaction.set_autocommit(False) 
for index, obj in enumerate(Place.objects.filter(type=Place.COUNTY)): 
    data = Place.objects.filter(second_order_division=obj, type=Place.TOWN, town_id_equal=True) 
    data.update(parent=obj) 
    print index 
    transaction.commit() 

回答

1

而不是使用循环,你应该做批量更新like

的第一笔交易,你可以将其替换您的交易此Django查询:

Place.objects.filter(type=Place.TOWN, town_id_equal=True).update(parent=F('second_order_division')) 

对于第二个事务,我们无法应用批量更新,因为对Place模型再次进行了查询。 为此,您应该在循环中每次都保存点击“Place.objects.get(town_id = place.town_id_extra)”的查询。

或可以帮助从这个blog

-1

回答一个更普遍的问题,一个策略,以改善几乎任何类型的系统的性能是:

最小化系统

的动态部分之间的相互作用

就是这样:通过HTTP请求,数据库查询等最小化交互。就您而言,您正在对数据库执行多个查询,可以轻松地将其减少到更少(也许一两个)。

+1

虽然这是一个重要的通知,这是不回答OP的问题。这个事实使得这是一个评论,而不是一个答案。因此,最好将此作为评论添加并删除此答案,或更新它以解决OP要求的答案。 – FallenAngel

+0

为什么不回答这个问题? – geekazoid

+0

因为你正在谈论*如何设计一个系统的非常基本的概念*,OP询问*他如何能够__优化他的现有系统* – FallenAngel