测试表名:d
1、判断一个表是否分析过:
select t.num_rows,t.avg_row_len from user_tables t where t.table_name ='D'、
若结果为空,则表示该表没有被分析过;
2、表没有被分析过时,oracle会采用动态采样的机制,去获取表的信息,从而得到执行计划
[动态采样.png]
动态采样的级别为0-10,0表示不动态采样,10表示最大级别的动态采样;
3、oracle默认的动态采样获取的表信息在表数据小于10W时,基本正确;当>10W时,数据量越大,获取的表信息误差越大,从而导致执行计划错误;
4、强制Hint设置表的动态采样级别:dynamic_sampling(d 0)--对d表不进行动态采样
5、手动执行sp去分析表信息(获取的表信息比动态采样获取的信息准确),从而不对表做动态采样
exec dbms_stats.gather_table_stats(user,'d',cascade=>true);--对表进行分析,然后就不会动态采样了;
exec dbms_stats.delete_table_stats(user,'d');--删掉表的分析动态信息,然后就会对表进行动态
6、 附加模拟测试环境举例:
select /*+ dynamic_sampling(t 0) cardinality(t 1)*/ * from t;
--取消动态采样和设置rownum=1;
注意:正确的表信息是生成正确的执行计划的前提。执行计划错误时,可以手动对表进行分析,从而获得正确的执行计划。
本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
时间: 2024-12-22 04:56:04