当前位置: 代码迷 >> Oracle开发 >> 查询性能有关问题
  详细解决方案

查询性能有关问题

热度:92   发布时间:2016-04-24 06:36:19.0
查询性能问题
oracle10g , 导入到新装的服务器后有个查询性能急剧下降,在原库查询大概为2秒,导入到新库后5分钟都不出来
explain plan 后的结果为
Plan
SELECT STATEMENT  ALL_ROWSCost: 7,131  Bytes: 44  Cardinality: 1  
13 SORT GROUP BY  Cost: 7,131  Bytes: 44  Cardinality: 1  
12 VIEW SMC. Cost: 7,130  Bytes: 44  Cardinality: 1  
11 HASH GROUP BY  Cost: 7,130  Bytes: 44  Cardinality: 1  
10 VIEW SMC. Cost: 7,129  Bytes: 44  Cardinality: 1  
9 WINDOW SORT  Cost: 7,129  Bytes: 151  Cardinality: 1  
8 HASH JOIN  Cost: 7,128  Bytes: 151  Cardinality: 1  
6 MERGE JOIN CARTESIAN  Cost: 3,040  Bytes: 298,468  Cardinality: 3,596  
3 NESTED LOOPS  Cost: 2,828  Bytes: 67  Cardinality: 1  
1 TABLE ACCESS FULL TABLE SMC.POS_SOUT Cost: 2,828  Bytes: 53  Cardinality: 1  
2 INDEX UNIQUE SCAN INDEX (UNIQUE) SMC.SYS_C005320 Cost: 0  Bytes: 14  Cardinality: 1  
5 BUFFER SORT  Cost: 3,040  Bytes: 425,840  Cardinality: 26,615  
4 TABLE ACCESS FULL TABLE SMC.PT_PART Cost: 212  Bytes: 425,840  Cardinality: 26,615  
7 TABLE ACCESS FULL TABLE SMC.POS_SOUT_DETL Cost: 4,077  Bytes: 61,046,796  Cardinality: 897,747 

------------------------------------------------------------------------------------------------------------
在原库里的结果是
Plan
SELECT STATEMENT  ALL_ROWSCost: 8,365  Bytes: 1,200  Cardinality: 25  
12 SORT GROUP BY  Cost: 8,365  Bytes: 1,200  Cardinality: 25  
11 VIEW SMC. Cost: 8,361  Bytes: 1,454,784  Cardinality: 30,308  
10 HASH GROUP BY  Cost: 8,361  Bytes: 1,515,400  Cardinality: 30,308  
9 VIEW SMC. Cost: 7,982  Bytes: 1,515,400  Cardinality: 30,308  
8 WINDOW SORT  Cost: 7,982  Bytes: 4,243,120  Cardinality: 30,308  
7 HASH JOIN  Cost: 7,035  Bytes: 4,243,120  Cardinality: 30,308  
1 TABLE ACCESS FULL TABLE SMC.PT_PART Cost: 213  Bytes: 603,420  Cardinality: 30,171  
6 HASH JOIN  Cost: 6,820  Bytes: 3,636,960  Cardinality: 30,308  
2 INDEX RANGE SCAN INDEX (UNIQUE) SMC.SYS_C006102 Cost: 1  Bytes: 1,170  Cardinality: 90  
5 HASH JOIN  Cost: 6,818  Bytes: 3,261,039  Cardinality: 30,477  
3 TABLE ACCESS FULL TABLE SMC.POS_SOUT Cost: 2,776  Bytes: 915,663  Cardinality: 18,687  
4 TABLE ACCESS FULL TABLE SMC.POS_SOUT_DETL Cost: 4,031  Bytes: 45,075,628  Cardinality: 777,166  

这里为什么在新库里会变成 MERGE JOIN  , 索引什么的都在的。(注:原库是32位,新的是64位。应该跟这个没关系吧。。只是安装oracle的时候安装包竟然要32位的.so 包,所以 LD_DIRECOTRY 指向的是  /url/lib   不是 lib64)
系统是 CentOS65. 64位的
------解决思路----------------------
导入后新的执行计划比旧的执行计划cost要小,很可能是统计信息的问题.当然也有可能是系统参数,服务器性能,表存储参数
参数等有关.
先执行一下:
begin
dbms_stats.gather_table_stats('SMC','POS_SOUT',estimate_percent => 30,cascade => true);
dbms_stats.gather_table_stats('SMC','POS_SOUT_DETL',estimate_percent => 30,cascade => true);
dbms_stats.gather_table_stats('SMC','PT_PART',estimate_percent => 30,cascade => true);
end;
看看情况.
如果不行,试试在语句select后加/*+leading(PT_PART,POS_SOUT,POS_SOUT_DETL)*/看会不会走原来的计划再说,
如果不行,试试在语句select后加/*+use_hash(POS_SOUT,POS_SOUT_DETL)*/试试


------解决思路----------------------
新库没有采集统计信息,手动重新采一下
特别是SMC.POS_SOUT表,严重偏差
  相关解决方案