外连接+聚合

来源:互联网 发布:java socket链接不上 编辑:程序博客网 时间:2024/06/15 02:35

数据库版本:10205

下面这条SQL执行时间大约为50秒,别名为Q的表大约有30W条数据。
语句如下:

这里写图片描述

首先看到wm_concat函数,10205以后的版本返回值已经改为CLOB,效率比较低,11GR2已经可以使用listagg进行替换,10205必须要自己创建函数了。

自定义函数如下:

create or replace type str_tab is table of varchar2(4000);CREATE OR REPLACE FUNCTION to_string (            nt_in        IN str_tab,            delimiter_in IN VARCHAR2 DEFAULT ','            ) RETURN VARCHAR2 IS   v_str VARCHAR2(32767);   v_dlm VARCHAR2(10);BEGIN   v_dlm := delimiter_in;   for i in 1..nt_in.count loop      v_str := v_str || v_dlm || nt_in(i);   end loop;   RETURN v_str;END to_string;

执行时间大约是6秒,但仍然不能接受,需继续优化。
把带聚合函数的查询去掉,查询很快,1秒内出结果;把带聚合函数的查询拿出来单独执行,也不是很慢,1秒多点;如果在一起执行,而且不是外连接的情况下,也很快,就是加上外连接后非常慢。
首先想到的是把带聚合函数的查询实体化,使用with as + HINT MATERIALIZE 的方法,结果反而更慢。
后经过大神的提示,考虑更改SQL的逻辑,之前的SQL逻辑是先聚合再表连接,尝试修改为先表连接再聚合。

这里写图片描述

修改后的SQL一秒内执行完毕。

0 0