database - 以高效的方式从 Oracle DB 中选择随机行

标签 database oracle database-performance

使用: Oracle Database 12c 企业版 Release 12.1.0.2.0

我正在尝试获取随机行。正如其他 stackoverflow 问题中所建议的那样,我像这样使用 DBMS_RANDOM.VALUE -

SELECT column FROM
( SELECT column 
  FROM table
  WHERE COLUMN_VALUE = 'Y' -- value of COLUMN_VALUE
  ORDER BY dbms_random.value 
)
WHERE rownum <= 1

但是,当请求数量增加时,此查询性能不佳。 所以我正在寻找替代方案。

SAMPLE 对我不起作用,因为通过该子句选取的样本没有与我的 WHERE 子句匹配的数据集。查询看起来像这样 -

SELECT column FROM table SAMPLE(1) WHERE COLUMN_VALUE = 'Y'

因为 SAMPLE 在我的 WHERE 子句之前应用,所以大多数情况下这不会返回任何数据。

P.S:我可以将部分逻辑移至应用层(尽管我绝对不是在寻找建议将所有内容加载到内存的答案)

最佳答案

性能问题包括两个方面:

  • 使用 column_value = 'Y'

    选择数据
  • 对该子集进行排序以获得随机记录

您没有说明您的表中具有 column_value = 'Y' 的子集是大还是小。这很重要,将插入您的战略。

如果有很多记录 column_value = 'Y' 使用SAMPLE 将行限制为按排序。 你是对的,这可能会导致空结果——在这种情况下重复查询(你可以另外添加一个逻辑来增加样本百分比以避免大量重复)。 这将在您对数据样本进行排序时提高性能

select id from (
select id from tt SAMPLE(1) where column_value = 'Y' order by  dbms_random.value )
where rownum <= 1; 

如果只有少数记录 column_value = 'Y' 在此列(或单独的分区)上定义索引 - 这可以有效访问记录.使用 order by dbms_random.value 方法。 排序不会降低少量行的性能。

select id from (
select id from tt where column_value = 'Y' order by  dbms_random.value )
where rownum <= 1;

基本上这两种方法都使排序后的行保持较小的尺寸。第一种方法执行与FULL TABLE SCAN 相当的表访问,第二种方法对选定的 column_value 执行INDEX ACCESS

关于database - 以高效的方式从 Oracle DB 中选择随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168121/

相关文章:

java - 构建准备好的语句时如何处理可选列

c# - 如何使用asp.net c#根据用户输入查询oracle数据库

postgresql - 如何监控 Heroku postgres 数据库

mysql - 如何从mysql数据库中选择键和值到json格式

sql - 如何在 SQL DB 上验证由连字符分隔的 2 年的 varchar 数据

sql - 运行 sql 文件而不打印其内容 POSTGRES

database - Vars to cases & retain variable/value labels Tableau setup - 为 Tableau 重组数据,翻转数据

c# - 在 C# 中的单个 Oracle 命令中执行多个查询

oracle - 如何在 pl/sql 中将 .dmp 文件转换为 .sql 文件

MySql InnoDB & 性能 : what is the best structure?