首页 > Linux操作系统 > Linux操作系统 > 一个条件引发的性能问题
废话少说,先看看SQL语句:
SELECT a.dwid,
a.xzdm,
a.grbh,
TRIM (b.xm),
c.sfzmhm,
'6',
c.ryzt,
c.rylb_dm,
c.ygxs_dm,
c.hjlx_dm,
a.jfzje - NVL (a.grbc01, 0) - NVL (a.gwybc01, 0),
a.jfgz
FROM a,
b,
c
WHERE a.dwid = 'x'
AND c.dwsbh = 'x'
AND a.grbh = b.grbh
AND a.grbh = c.sbbh;
表a和b的总记录数在100万条左右,a.dwid和b.dwsbh上均有索引,条件'x'过滤后的记录数大约是3万条左右。另外,a.grbh和c.sbbh上亦均有索引。
sql语句执行计划如下:
Plan
SELECT STATEMENT CHOOSE
11 FILTER
10 NESTED LOOPS OUTER
8 NESTED LOOPS
5 NESTED LOOPS
2 TABLE ACCESS BY INDEX ROWID C
1 INDEX RANGE SCAN NON-UNIQUE IDX_C_DWSBH
4 TABLE ACCESS BY INDEX ROWID A
3 INDEX RANGE SCAN NON-UNIQUE IDX_A_DWID00
7 TABLE ACCESS BY INDEX ROWID B
6 INDEX UNIQUE SCAN UNIQUE SYS_C0014448
9 INDEX UNIQUE SCAN UNIQUE SYS_C0024173
语句执行了30mins以上仍然没有执行完毕。
把sql语句改为:
SELECT a.dwid,
a.xzdm,
a.grbh,
TRIM (b.xm),
c.sfzmhm,
'6',
c.ryzt,
c.rylb_dm,
c.ygxs_dm,
c.hjlx_dm,
a.jfzje - NVL (a.grbc01, 0) - NVL (a.gwybc01, 0),
a.jfgz
FROM a,
b,
c
WHERE a.dwid = 'x'
AND a.grbh = b.grbh
AND a.grbh = c.sbbh;
执行计划:
Plan
INSERT STATEMENT CHOOSE
11 FILTER
10 NESTED LOOPS OUTER
8 NESTED LOOPS
5 NESTED LOOPS
2 TABLE ACCESS BY INDEX ROWID A
1 INDEX RANGE SCAN NON-UNIQUE IDX_A_DWID00
4 TABLE ACCESS BY INDEX ROWID C
3 INDEX UNIQUE SCAN UNIQUE SYS_C0024164
7 TABLE ACCESS BY INDEX ROWID B
6 INDEX UNIQUE SCAN UNIQUE SYS_C0014448
9 INDEX UNIQUE SCAN UNIQUE SYS_C0024173
从两者的执行计划来看,驱动表不同而已,由于记录数相差不大,影响不大,不过去掉条件c.dwsbh='x'后,这条语句执行时间<2secs,效率相差N倍。
其实读取A表的数据后,就可以根据A的grbh通过c.sbbh上的索引访问表c了,加上了条件c.dwsbh='x'反而是画蛇添足,严重影响效率。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-531656/,如需转载,请注明出处,否则将追究法律责任。