gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com