Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用“分组依据”选择一个组?_Java_Oracle_Jakarta Ee_Oracle11g - Fatal编程技术网

Java 如何使用“分组依据”选择一个组?

Java 如何使用“分组依据”选择一个组?,java,oracle,jakarta-ee,oracle11g,Java,Oracle,Jakarta Ee,Oracle11g,我们有一个Oracle 11g表,大约有7500万行。其中一列称为DOKUMENTUMID,除了几千行重复之外,它的值或多或少都是唯一的。由于遗留软件的原因,我们无法在此领域添加唯一的约束 然而,现在我们可以添加一个唯一的索引,但要实现这一点,首先我们必须清除当前的重复项。为此,我们必须执行SQL无法提供的其他复杂操作。(文件系统更改/调用API方法等…) 我们有一个标准的Java体系结构,可以很好地用于此类任务。这个JavaEE应用程序有一个由调度器调用的单例类。此单例从数据库获取下一个任务,

我们有一个Oracle 11g表,大约有7500万行。其中一列称为DOKUMENTUMID,除了几千行重复之外,它的值或多或少都是唯一的。由于遗留软件的原因,我们无法在此领域添加唯一的约束

然而,现在我们可以添加一个唯一的索引,但要实现这一点,首先我们必须清除当前的重复项。为此,我们必须执行SQL无法提供的其他复杂操作。(文件系统更改/调用API方法等…)

我们有一个标准的Java体系结构,可以很好地用于此类任务。这个JavaEE应用程序有一个由调度器调用的单例类。此单例从数据库获取下一个任务,并将其放入JMS队列中。许多消息驱动bean正在侦听这些消息并执行任务

我正在寻找一种从表中选择副本并将其放入JMS队列的快速方法。目前我的SQL语句如下

select
inner_select.DOKUMENTUMID from (
    select
        inner_d.DOKUMENTUMID,
        count(*) CNT
    from 
        DOKUMENTUM inner_d
    group by 
        inner_d.DOKUMENTUMID
    having
        count(*) > 1
    ) inner_select
where
    rownum = 1
order by 
    inner_select.DOKUMENTUMID desc,
    inner_select.CNT desc;
它运行大约20秒,这有点太慢了。我认为Oracle对7000多万个文档进行了完整的表扫描,这是不必要的,因为这次我们只需要一个组

该计划解释说:


计划B是减少运行调度方法的频率,同时向队列添加多条消息,但我担心这可能会导致系统负载不均衡

您在DOKUMENTUMID上有一个索引,并尝试了从~GROUP BY~ have~ ORDER BY DOKUMENTUMID中简单地选择DOKUMENTUMID?rownum stopkey限制应用于聚合—它进行了大量扫描,每次仅获取一行。我想知道您是否可以自由地创建一个短期工作表(或者临时表,如果会话是长期的),并使用
internal\u select
(只运行一次昂贵的select)的结果加载,然后查询(并清理)工作表以对异步处理而不是内联视图进行排队?您是否可以自由缓存或具体化内部选择的结果?亲爱的alexgibbs,Joop Eggen-感谢您的回复!是的,DOKUMENTUMID是索引的。是的,我可以创建一个工作台,我要做的就是加快速度。非常感谢你!您在DOKUMENTUMID上有一个索引,并尝试了从~GROUP BY~ have~ ORDER BY DOKUMENTUMID中简单地选择DOKUMENTUMID?rownum stopkey限制应用于聚合—它进行了大量扫描,每次仅获取一行。我想知道您是否可以自由地创建一个短期工作表(或者临时表,如果会话是长期的),并使用
internal\u select
(只运行一次昂贵的select)的结果加载,然后查询(并清理)工作表以对异步处理而不是内联视图进行排队?您是否可以自由缓存或具体化内部选择的结果?亲爱的alexgibbs,Joop Eggen-感谢您的回复!是的,DOKUMENTUMID是索引的。是的,我可以创建一个工作台,我要做的就是加快速度。非常感谢你!