我有一个从另一个继承的表,有超过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分钟,对于代码的应用和它将执行的频率并不令人满意。 有没有办法改善表现?
答案 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字符串,尽管这似乎不是问题所在。