如何提高sqlalchemy中频繁查询表的性能?

时间:2015-01-02 13:01:50

标签: performance sqlalchemy

我有一个从另一个继承的表,有超过10,000行和10列。 我正在从输入中读取超过10,000个项目。对于每个项目,我查询表格以查看数据是否不存在。 在这种情况下,我将其插入表中。 一个简化的例子如下:

class Port(Interface):
    __tablename__ = 'ports'
    Int_Class_ID = Column(Integer, ForeignKey('interfaceitems.Int_Class_ID', ondelete='cascade'), primary_key=True)
    __mapper_args__ = {
        'polymorphic_identity': 'ports',
    }
    Name = Column(Text)
    Locked = Column(Boolean)
    UniqueIdentifier = Column(Text, index=True)

然后我这样做:

portList = Session.query(Port).filter(Port.UniqueIdentifier == ID).all()

例如,将召集10,000次。 但是这非常慢,需要3分钟,对于代码的应用和它将执行的频率并不令人满意。 有没有办法改善表现?

1 个答案:

答案 0 :(得分:2)

您似乎正在读取ID,然后分别为每个ID调用Query。这将非常慢,并且您希望一次读取更大的项目列表。我通常这样做的方法是使用块;这样你每个查询肯定有很多项目,但是你不能在一个查询中用太多的ID来加载系统:

list_of_ids = list(input_ids)
while list_of_ids:
    chunk = list_of_ids[0:1000]
    list_of_ids = list_of_ids[1000:]
    for port_object in session.query(Port).filter(Port.uniqueidentifier.in_(chunk)):
        process_object(port_object)

使用上面的代码,而不是每行发出10000个查询,而不是每次发出10个查询,每行1000行。它应该很快运行。

如果问题出在其他地方,例如阅读所有10K行太慢,并且您无法解决多行查询,那么orm slowness中的提示会有所帮助。即将发布的baked query功能也有助于从查询中生成SQL字符串,尽管这似乎不是问题所在。