orcale优化,求大神指点一二

select RONO,OverdueDay from
(select RONO,
case when (select sum(Amount) as Ccount from EAM_Charge_Detail where ChargeType<>7012785 and H.BIZDATE<=bizdate)
- (select CAV_amount from V_HX07_REPORT_RECEIVE_NEW t1
where t1.receivedate<=H.bizdate) > 0 then to_number(sysdate-bizdate) else 0 end as OverdueDay
from (
select RoNo,bizdate from
(select ORDERNO AS RONO,bizdate from EAM_Charge_Detail

union
select RONO,receivedate as bizdate from V_HX07_REPORT_RECEIVE_NEW)
order by bizdate desc
) H );

新手菜鸟求帮助。两张表联合起来大概有一千多万条数据,查询不出数据来 显示一直在执行,是不是我哪里写错了 求大神帮忙看看哪里不对。

由于没有执行计划,只能试着去提出可能存在的问题
问题1:
如果不需要剔除重复记录,union 改成union all
问题2:
去除order by操作

相信以上两个解决掉以后,会快很多

接下来看其他问题:
问题3:
bizdate是否存在索引,需要确定一下。
问题4:
select CAV__amount from V_HX07_REPORT_RECEIVE_NEW t1 where t1.receivedate<=H.bizdate
这里总感觉会有问题,万一查出多条记录还会报错。
t1表是否有索引,也要看看。
问题5:
已经不需要在外面在嵌套一层了。去除最外层的嵌套。

优化完成之后,可以看看explian

表体 oracle 拼错;
sql case when有问题,例如:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

sex字段未声明

以下仅供参考:
1、条件有没有用到索引
2、能不能拆分查询,分别插入到中间表,再统一查询
3、能不能把重复统一的表值统一一次

我去,老铁你这sql,没有表结构和数据我没法给你排错。你自己分段执行一下看看是哪一步的问题,然后仔细找找 这一步是哪里错了?再去百度一下,看到底是什么原因错了,找网上正确sql的执行几遍。我觉得你这个case when 写的有点复杂 。

我看了几分钟你这条sql,听你说联合查询后有1000W条记录,但是也只有两张表EAM_Charge_Detail 、V_HX07_REPORT_RECEIVE_NEW。

其执行速度慢的原因在你数据库压力过大,因为你把一些逻辑运算都交给了数据库处理,理应数据库只做查询工作,避免其他的运算。
逻辑运算应放到java中去处理,建议使用java来处理逻辑运算,降低数据库压力

                SELECT
                    RoNo,
                    bizdate
                FROM
                    (
                        SELECT
                            ORDERNO AS RONO,
                            bizdate
                        FROM
                            EAM_Charge_Detail
                        UNION
                            SELECT
                                RONO,
                                receivedate AS bizdate
                            FROM
                                V_HX07_REPORT_RECEIVE_NEW
                    )
                ORDER BY
                    bizdate DESC

可以对表增加索引,这样对100w+数据查询速度提升的非常明显。BIZDATE 这个字段是索引的关键字段。

数据库中加索引是可以提高查询速度,若是把这么多数据用程序读出来,肯定会很慢,通常会使用分页在程序中显示,但数据太多会很慢,
这时就需要考虑是否能在数据库中进行分页提取数据,直接看代码
public static DataTable GetDateTableStringData(string s_date_sql, int PageIndex, int displayCount, string connString)
{
string sql = "select * from ( select row_.*, rownum rownum_ from ( " + s_date_sql + ") row_ where rownum <= " + (PageIndex + 1) * displayCount + " ) where rownum_ >=" + ((PageIndex * displayCount) + 1);
return common.Query(sql, connString).Tables[0];
}
这样在程序中速度就会快很多