日期:2014-05-17  浏览次数:54720 次

SQL文优化问题
SELECT   *  
FROM   a,b,c  
WHERE
a.f1   =   b.f1   AND
a.f2   =   c.f1   AND
a.f3   =   c.f2

a表pk     f1
b表pk     f1
c表pk     f1,f2

a表,5万条记录
b表,10条
c表,100条

现在这个sql文性能很差,甚至把b表所有记录清空了也一样。
怎么进行优化?

------解决方案--------------------
对a、b、c三个表做分析。exec dbms_stats.gather_table_stats( 'USERNAME ', 'TABLENAME ')
------解决方案--------------------
sqlplus 看执行计划

sql> set autotrace trace exp
sql> SELECT *
FROM a,b,c
WHERE
a.f1 = b.f1 AND
a.f2 = c.f1 AND
a.f3 = c.f2

看下执行计划

查看等待事件 select * from v$session_wait

估计是A表没有用上索引,建立A表的(F1,F2,F3)复合索引再试下
------解决方案--------------------
SELECT *
FROM c,a,b
WHERE
a.f2 = c.f1 AND
a.f3 = c.f2 AND
b.f1 = a.f1