WMSYS.WM_CONCAT功能缓慢

时间:2014-03-03 08:52:22

标签: sql oracle oracle10g

当我使用Oracle函数WMSYS.WM_CONCAT时,我的SQL执行速度非常慢。我怎样才能加快速度?查询是:

SELECT T.A,
       T.B,
       WMSYS.WM_CONCAT(T.C),
       WMSYS.WM_CONCAT(T.D) 
  FROM ( SELECT A,B,C,D FROM TABLE_NAME ) T 
 GROUP BY T.A ,T.B

该表包含大约200万行,并且在相关列上有索引。

3 个答案:

答案 0 :(得分:1)

在10.2上,最快的字符串聚合方法使用CAST COLLECT,如this oracle-developer.net article中所述。

 SELECT T.A,
        T.B,
        to_string(cast(collect(T.C) as varchar2_ntt)),
        to_string(cast(collect(T.D) as varchar2_ntt))
FROM  (SELECT A,B,C,D FROM TABLE_NAME) T 
GROUP BY T.A,T.B;

请注意,WM_CONCAT在Express Edition,未安装Workspace Manager的数据库和12c中不起作用。

答案 1 :(得分:0)

您可以尝试以下方法:

SELECT DISTINCT
    A,
    B,
    WMSYS.WM_CONCAT(C) OVER (PARTITION BY A,B) concat_c,
    WMSYS.WM_CONCAT(D) OVER (PARTITION BY A,B) concat_d
FROM TABLE_NAME 

答案 2 :(得分:0)

使用WM_CONCAT时滞后很明显。我所知道的最简单的解决方案是简单地将to_char()函数包裹起来。对于一个包含2个wm_concats和一个listagg的报告,它将运行时间从1分13秒缩短到7秒。没有自己测试listagg,但我有wm_concat并且它一致,并且大大改善了运行时间。