如何提高sqlalchemy中频繁查询a table的性能?
How to improve the performance of frequent querying of a table in sqlalchemy?
我有一个 table 继承自另一个并且有超过 10,000 行和 10 列。
我正在从输入中读取 10,000 多个项目。对于每个项目,我查询 table 以查看数据是否不存在。
在本例中,我将其插入 table。
一个简化的例子如下:
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分钟,这对于代码的应用和执行的频率来说并不令人满意。
有什么办法可以提高性能吗?
您似乎正在读取 ID,然后分别为每个 ID 调用 Query。这将非常慢,并且您想一次阅读更大的项目列表。我通常这样做的方式是使用块;这样你肯定每个查询都有很多项目,但你不会在一个查询中加载太多 ids:
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 个查询,而是每个查询针对 1000 行只发出十个查询。它应该 运行 很快。
如果问题出在其他地方,比如读取所有 10K 行太慢,并且您无法解决发出许多行的查询,orm slowness will help. The upcoming baked query 功能中的提示也将有助于生成来自查询的 SQL 字符串,尽管这似乎不是这里的问题。
我有一个 table 继承自另一个并且有超过 10,000 行和 10 列。 我正在从输入中读取 10,000 多个项目。对于每个项目,我查询 table 以查看数据是否不存在。 在本例中,我将其插入 table。 一个简化的例子如下:
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分钟,这对于代码的应用和执行的频率来说并不令人满意。 有什么办法可以提高性能吗?
您似乎正在读取 ID,然后分别为每个 ID 调用 Query。这将非常慢,并且您想一次阅读更大的项目列表。我通常这样做的方式是使用块;这样你肯定每个查询都有很多项目,但你不会在一个查询中加载太多 ids:
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 个查询,而是每个查询针对 1000 行只发出十个查询。它应该 运行 很快。
如果问题出在其他地方,比如读取所有 10K 行太慢,并且您无法解决发出许多行的查询,orm slowness will help. The upcoming baked query 功能中的提示也将有助于生成来自查询的 SQL 字符串,尽管这似乎不是这里的问题。