这真的很快:
tgt_ids = [x.id for x in DBSession.query(getattr(cls, 'id')).all()]
这真的很慢:
tgt_ids = [x.id for x in DBSession.query(cls).options(load_only('id')).all()]
我观察到两者之间的SQL类似并且执行得非常快,但在后一种情况下,Python会导致30秒的高CPU负载。
为什么呢?
(cls
是以声明方式定义的典型用户SQA类)
答案 0 :(得分:0)
可能是
的事实tgt_ids = [x.id for x in DBSession.query(getattr(cls, 'id')).all()]
生成包含(<type of your id column>,)
的结果元组(结果元组被标记,这就是x.id有效的原因),但是
tgt_ids = [x.id for x in DBSession.query(cls).options(load_only('id')).all()]
构造完整的模型对象,但仅填充id属性。