【发布时间】:2017-05-10 08:01:33
【问题描述】:
我想使用 sqlalchemy 从我的 postgres 数据库中检索一组随机的 X 条目。我的第一个方法是这样的
random_set_of_Xrows = models.Table.query.filter(something).order_by(func.random()).limit(len(X)).all()
由于我的表很大,这个命令大约需要 1 秒,我想知道如何优化它。我猜 order_by 函数需要查看所有行,所以我认为使用 offset 可能会使其更快。但是,我不太明白如何完全避免行数? 这是一种使用偏移的方法
rowCount = db.session.query(func.count(models.Table.id)).filter(something).scalar()
random_set_of_Xrows = models.Table.query.offset(func.floor(func.random()*rowCount)).limit(len(X)).all()
但这并不快,大部分时间都花在获取 rowCount 上。 任何想法如何使这更快? 干杯 卡尔
编辑:如下所示,我在表中添加了一个带有随机值的列,并用它来提取行
random_set_of_Xrows = models.Table.query.filter(something).order_by(models.Table.random_value).limit(len(X)).all()
我确实忽略了偏移部分,因为如果两个调用给我相同的结果对我来说并不重要,我只需要一组随机的行。
【问题讨论】:
-
是的,我已经看到了,但它并没有真正解决避免行数的问题......如果这可能的话......
-
hi hiro...抱歉,这个建议与我的第一种方法有什么不同?
-
how to avoid the row count entirely- 考虑使用估计值而不是精确的行数:SELECT reltuples::bigint AS estimate FROM pg_class where relname='mytable';详细信息请参阅此答案:stackoverflow.com/questions/7943233/…
标签: python postgresql sqlalchemy flask-sqlalchemy