使用: 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/