【问题标题】:How to improve the performance of frequent querying of a table in sqlalchemy?sqlalchemy中如何提高频繁查询表的性能?
【发布时间】:2015-01-11 07:06:22
【问题描述】:

我有一个表继承自另一个表,并且有超过 10,000 行和 10 列。 我正在从 Input 中读取 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 分钟,这对于代码的应用和执行的频率来说并不令人满意。 有什么方法可以提高性能吗?

【问题讨论】:

    标签: performance sqlalchemy


    【解决方案1】:

    您似乎正在读取 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 个查询,而是针对每个 1000 行仅发出 10 个查询。它应该运行得很快。

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

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2016-01-17
      相关资源
      最近更新 更多