当我使用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万行,并且在相关列上有索引。
答案 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并且它一致,并且大大改善了运行时间。