oracle

时间:2019-03-18 12:41:52

标签: oracle plsql

我们需要从下表中获取具有上述匹配条件的记录,并将UNIQUE COL3的数量限制为20K。

我们已经通过使用DENSE_RANK()逻辑实现了这一目标,但是当我们在实时系统中实现时,我们发现性能极其缓慢。

要处理20K UNIQUE COL3和60K总记录,需要14到15个小时才能完成(该过程每天运行一次,并从视图中选择FROM,然后根据View记录对少数几张表执行DML操作)。

SELECT COUNT (distinct COL3) CNT1,COUNT(1) CNT2 FROM VW_ENTP;
--20,000                                                  60,000

没有逻辑的情况下,DENSE_RAN()的完成速度非常快,而DENSE_RAN()的逻辑则非常慢。

请求您的帮助,以分享有关提高查询性能的任何建议或其他替代方法。预先感谢!

示例查看代码

CREATE OR REPLACE VIEW VW_ENTP(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10) AS
SELECT
COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10
 FROM
(
SELECT
           NP.NFCD COL1,
           D.CLO2 COL2,
           NP.COL3 COL3,
           E.COL4 COL4,
           EDT.COL5,
           EDT.COL6,
           NP. COL7,
           NP. COL8,
           EDT.COL9 COL9,
           NP.COL10,
           DENSE_RANK() OVER (ORDER BY NP.COL3) RANK
  FROM ENP NP,EDTS EDT,EM E,EDT D,BDT BD
WHERE EDT.COL2=D.COL2
  AND E.COL3=NP.COL3
  AND E.COL7=NP.COL7
  AND E.COL8=NP.COL8
  AND E.APP=NP.APP
  AND NP.STATUS='P'
  AND NP.NFCD=D.COL1
  AND E.SUSP !='YES'
  AND NP.APP='EDOC'
  AND TRUNC(NP.RC_DATE)<=TRUNC(BD.LAST_RUN_DATE)
)
  WHERE RANK<=20000;

注意:以上使用的列均已建立索引。

2 个答案:

答案 0 :(得分:0)

您只能通过row_number()函数实现此目的:

CREATE OR REPLACE VIEW VW_ENTP(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10) AS
SELECT
COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10
 FROM
(select a.*, row_number() over (order by col3) rn from (
SELECT
           NP.NFCD COL1,
           D.CLO2 COL2,
           NP.COL3 COL3,
           E.COL4 COL4,
           EDT.COL5,
           EDT.COL6,
           NP. COL7,
           NP. COL8,
           EDT.COL9 COL9,
           NP.COL10,
           row_number() OVER (partition by np.col3 ORDER BY NP.COL3) RANK
  FROM ENP NP,EDTS EDT,EM E,EDT D,BDT BD
WHERE EDT.COL2=D.COL2
  AND E.COL3=NP.COL3
  AND E.COL7=NP.COL7
  AND E.COL8=NP.COL8
  AND E.APP=NP.APP
  AND NP.STATUS='P'
  AND NP.NFCD=D.COL1
  AND E.SUSP !='YES'
  AND NP.APP='EDOC'
  AND TRUNC(NP.RC_DATE)<=TRUNC(BD.LAST_RUN_DATE)
) a where rank > 1 and rank <= 20000) 

;

当前查询结果:

COL3排名

1 1

2 1

3 1

3 2

3 3

3 4

4 1

5 1

要求:

COL3排名

1 1

2 2

3 3

3 3

3 3

3 3

4 4

5 5

答案 1 :(得分:0)

通常,如果错过任何连接条件,则会导致性能下降。另外,您正在加入其他几个表,任何表都可能导致性能问题。只有在查看了这些表之后,才能为他们提供建议。

要确认密集等级是否是导致此问题的原因,可以将其删除并执行select语句。如果花费的时间较少,则可以得出结论:密集等级是造成此问题的原因。但我高度怀疑这会发生。