2012-08-28 64 views
0

如果可能的话,请你能帮助我的SQL,我需要优化的以下代码块,如果以迭代值更快。见下面的语句:的Oracle PL/FOR循环优化

for CONSULTANT_RECORD IN CONSULTANT_CURSOR LOOP /*Loop 2*/ 
VData := VData||crlf2||CONSULTANT_RECORD.USER_FIRSTNAME||' '||CONSULTANT_RECORD.USER_SURNAME; 

vTOT_LOG_CLOSED4USER := 0; 
vAVERAGE_DAY := 0; 
vTOT_DAYS := 0; 
for x in 1..vlastday loop /*Loop 3*/ 
    select COUNT(DISTINCT LOG_NO) as "LOG_COUNT" INTO vLOG_COUNTER 
    FROM DMS_CRM.TBL_DMS_SERVICE_REQUESTS_HIST 
     WHERE LOG_STATUS = 'Resolved' 
     AND TO_CHAR(HIST_DATE_TIME_STAMP, 'MONTH,YYYY') = TO_CHAR(SYSDATE, 'MONTH,YYYY') 
     AND TO_CHAR(HIST_DATE_TIME_STAMP, 'DD') = lpad(to_char(x),2,'0') 
     AND OWNER_USER_ID IS NOT NULL 
     AND OWNER_USER_ID = CONSULTANT_RECORD.OWNER_USER_ID; 

    end loop; 
END LOOP; 

的问题开始在环评3发生,裸记住IM发展对甲骨文的应用程序门户,所以我不能运行的查询优化...我的表索引正确以及(如果有人想评论一下)。

Regards,

PS。谁也没有得到回我用自己版本的代码..........我仍然用这种:-(挣扎

回答

1

我认为最好的循环在所有(不循环肯定的是,如果它可避免)。假设vlastday是一个集合,你可以这样做

select COUNT(DISTINCT LOG_NO) as "LOG_COUNT" 
FROM DMS_CRM.TBL_DMS_SERVICE_REQUESTS_HIST 
INNER JOIN 
    (
    SELECT lpad(to_char(t.COLUMN_VALUE),2,'0') as x 
    from table(vlastday)t 
)a ON (TO_CHAR(HIST_DATE_TIME_STAMP, 'DD') = a.x) 
    WHERE LOG_STATUS = 'Resolved' 
    AND TO_CHAR(HIST_DATE_TIME_STAMP, 'MONTH,YYYY') = TO_CHAR(SYSDATE, 'MONTH,YYYY')  
    AND OWNER_USER_ID IS NOT NULL 
    AND OWNER_USER_ID = CONSULTANT_RECORD.OWNER_USER_ID 
    GROUP BY a.x; 

然后取决于你的任务,你需要或者摆脱GROUP BY这样你就可以select into,或申报数量的集合, BULK COLLECT进入这个变量

此外,我从我在问题中看到的,你可以做Loop2几乎相同,所以你不会ve循环...

+0

不幸的是,vlastday不是一个集合,而是一个检索当天ie.28/* vlastday:= to_number(to_char(LAST_DAY(TO_DATE(sysdate)),'DD')); */ – user1630342

+0

@ user1630342:好的,我明白了。这样你就可以创建一个数字集合,用值(1,2,...等)填充它,并执行加入这个集合的'SELECT'。而不是有31个“选择”,你将只有一个应该显着提高性能。 – a1ex07

+0

我怎么去有关处理一个选择而不是多个选择(通过回路)..问题是,我已经重复多天的多个顾问......他们的价值观在整个天都不同,我也是递增的日期值在select语句中,以适应不同的日子.... ie./*AND TO_CHAR(HIST_DATE_TIME_STAMP,'DD')= lpad(to_char(x),2,'0')* / – user1630342