【问题标题】:getting a random set of database entries获取一组随机的数据库条目
【发布时间】: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


【解决方案1】:

我之前通过添加索引列r 对此进行了优化,该列在创建行时自动插入随机值。然后,当您需要一组随机的行时,只需 SELECT * FROM table ORDER BY r LIMIT 10 OFFSET some_random_value。您可以运行更新架构的脚本,以将此列添加到现有行。您将使用这种方法对写入添加轻微的性能影响,但如果这是您一直需要的功能,它应该是一个公平的权衡。

【讨论】:

  • hi mVChr...感谢您的回答...我原以为 order_by 需要查看所有行?
  • 只是为了更新我之前的评论...我实现了它,它并不比我以前的解决方案快...我在上面添加了我的确切实现
  • 抱歉,您的方法更快...原来我的通话中的过滤器步骤没有变得更快...我会接受您的回答
  • @carl 因为它已编入索引,所以该列的顺序是已知的,不需要在查询时进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2015-10-21
  • 2023-04-05
  • 2014-11-29
  • 2019-08-19
  • 2022-01-23
相关资源
最近更新 更多