我想使用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()
我确实忽略了偏移部分,因为如果两个调用给我相同的结果对我没关系,我只需要一组随机的行。
答案 0 :(得分:1)
我之前通过添加索引列r
对其进行了优化,该列在创建行时自动插入随机值。然后当你需要一组随机的行SELECT * FROM table ORDER BY r LIMIT 10 OFFSET some_random_value
时。您可以运行更新架构的脚本,以将此列添加到现有行。使用这种方法,您可以为写入添加轻微的性能损失,但如果这是一个您需要持久保留的功能,那么它应该是一个公平的权衡。