1.首先是一个视图CREATE OR REPLACE VIEW v_info AS
(SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
UNION ALL
(SELECT re_code AS code,
t.no AS no
TO_CHAR(mod(t.gtet_no,1000000)) AS agent_code1,
TO_CHAR(mod(t.gtet_no1,1000000)) AS agent_code2,
TO_CHAR(mod(t.gtet_no2,1000000)) AS agent_code3
FROM policy t, status sts
WHERE t.no = sts.no
AND sts.status = 'I'
AND NOT EXISTS (SELECT 1
FROM mapping_table u
WHERE u.no = t.no AND u.is_pol = 'Y'))
UNION ALL
(SELECT '' AS code,no,
TO_CHAR(MOD(agt1,1000000)) AS agent_code1,
TO_CHAR(MOD(agt12,1000000)) AS agent_code2,
'' as agent_code3
FROM life v
WHERE NOT EXISTS (SELECT 1
FROM mapping_table w
WHERE w.no = v.no AND w.is_pol = 'N')
)该视图的相关联的表单数据均为100W条记录问题如下:
1.单单从这个view里取记录,很快--也就3秒左右,如果要select count(1) from v_info
where code = 'L' and (AGENT_CODE1='9865' or AGENT_CODE2='9865' or AGENT_CODE3='9865');计算记录数目则很慢,需要30秒左右!!!
2.select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854' or AGENT_CODE2='32854' or AGENT_CODE3='32854')
order by u_date desc,id desc)
where rownum <= 10;这样取出头十条记录----也需要30-40秒
3.客户要求要很快,这样不行,希望大家出手相助,多谢!!!!
(SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
UNION ALL
(SELECT re_code AS code,
t.no AS no
TO_CHAR(mod(t.gtet_no,1000000)) AS agent_code1,
TO_CHAR(mod(t.gtet_no1,1000000)) AS agent_code2,
TO_CHAR(mod(t.gtet_no2,1000000)) AS agent_code3
FROM policy t, status sts
WHERE t.no = sts.no
AND sts.status = 'I'
AND NOT EXISTS (SELECT 1
FROM mapping_table u
WHERE u.no = t.no AND u.is_pol = 'Y'))
UNION ALL
(SELECT '' AS code,no,
TO_CHAR(MOD(agt1,1000000)) AS agent_code1,
TO_CHAR(MOD(agt12,1000000)) AS agent_code2,
'' as agent_code3
FROM life v
WHERE NOT EXISTS (SELECT 1
FROM mapping_table w
WHERE w.no = v.no AND w.is_pol = 'N')
)该视图的相关联的表单数据均为100W条记录问题如下:
1.单单从这个view里取记录,很快--也就3秒左右,如果要select count(1) from v_info
where code = 'L' and (AGENT_CODE1='9865' or AGENT_CODE2='9865' or AGENT_CODE3='9865');计算记录数目则很慢,需要30秒左右!!!
2.select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854' or AGENT_CODE2='32854' or AGENT_CODE3='32854')
order by u_date desc,id desc)
where rownum <= 10;这样取出头十条记录----也需要30-40秒
3.客户要求要很快,这样不行,希望大家出手相助,多谢!!!!
有没有取代的办法,大家都发表高见呀!!
Explain plan forSELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
UNION ALL
(SELECT re_code AS code,
t.no AS no
TO_CHAR(mod(t.gtet_no,1000000)) AS agent_code1,
TO_CHAR(mod(t.gtet_no1,1000000)) AS agent_code2,
TO_CHAR(mod(t.gtet_no2,1000000)) AS agent_code3
FROM policy t, status sts
WHERE t.no = sts.no
AND sts.status = 'I'
AND NOT EXISTS (SELECT 1
FROM mapping_table u
WHERE u.no = t.no AND u.is_pol = 'Y'))
UNION ALL
(SELECT '' AS code,no,
TO_CHAR(MOD(agt1,1000000)) AS agent_code1,
TO_CHAR(MOD(agt12,1000000)) AS agent_code2,
'' as agent_code3
FROM life v
WHERE NOT EXISTS (SELECT 1
FROM mapping_table w
WHERE w.no = v.no AND w.is_pol = 'N')
Select * from table(dbms_xplan.display);看看结果中有没有全表扫描。
Explain plan for SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
UNION ALL
(SELECT re_code AS code,
t.no AS no
TO_CHAR(mod(t.gtet_no,1000000)) AS agent_code1,
TO_CHAR(mod(t.gtet_no1,1000000)) AS agent_code2,
TO_CHAR(mod(t.gtet_no2,1000000)) AS agent_code3
FROM policy t, status sts
WHERE t.no = sts.no
AND sts.status = 'I'
AND NOT EXISTS (SELECT 1
FROM mapping_table u
WHERE u.no = t.no AND u.is_pol = 'Y'))
UNION ALL
(SELECT '' AS code,no,
TO_CHAR(MOD(agt1,1000000)) AS agent_code1,
TO_CHAR(MOD(agt12,1000000)) AS agent_code2,
'' as agent_code3
FROM life v
WHERE NOT EXISTS (SELECT 1
FROM mapping_table w
WHERE w.no = v.no AND w.is_pol = 'N') Select * from table(dbms_xplan.display);
看看结果中有没有全表扫描。
重点优化!效率差的那段SQL语句!
1.查询慢的问题在以下的这句sql上:
SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
2.但是有没有办法建上索引,而查询该视图的sql:(因为view的AGENT_CODE2和AGENT_CODE3为空,该如何建表-- bbs_info的索引? )
.select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854' or AGENT_CODE2='32854' or
AGENT_CODE3='32854')
order by u_date desc,id desc)
where rownum <= 10;
3.谢谢大家的不懈帮助,问题解决,马上给分!!!
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N'
AND NOT EXISTS (SELECT 1
FROM policy v
WHERE v.no = apm2.no)) AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y')
_______________________________
先把那段NOT exists去掉!
SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3,
(SELECT COUNT (1)
FROM agd_pping apm2
WHERE apm2.code = s.code
AND apm2.id = s.id
AND apm2.is_pol = 'N' )
AS number1,
FROM bbs_info s
WHERE del_flag <> 'Y') 估计是NOT exists惹的祸
你可以把给数据实例,看SQL用别的办法来实现你的要求,不用NOT EXISTS!
而v_info 视图的where却有条件code,AGENT_CODE1,AGENT_CODE2,AGENT_CODE3!!!这样的情况该在表bbs_info 上的那个(些)字段检索引!
thanks!!
还有
SELECT code, TO_CHAR (id) AS no,
agent_code AS agent_code1, '' AS agent_code2, '' AS agent_code3
FROM bbs_info s
WHERE del_flag <> 'Y') 测试一下这个语句用的时间?
select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854' or AGENT_CODE2='32854' or
AGENT_CODE3='32854')
order by u_date desc,id desc)
where rownum <= 10;
结果是还要20多秒,没有变化,看来子查询的影响不大,还不是真正的病根!!!
然后分别查询条件的字段都加索引
有函数的字段,加函数索引这样就可以比较快了
select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854' or AGENT_CODE2='32854' or
AGENT_CODE3='32854') order by u_date desc,id desc)
where rownum <= 10; 改成下面这样,就很快(2秒左右)
select *
from ( no,id,status,u_date
from v_info where code = 'L' and (AGENT_CODE1='32854') order by u_date desc,id desc)
where rownum <= 10;