一次ORA-4030问题诊断及解决(三)
2008-09-08 12:51:03 来源:WEB开发网可以看到,在Oracle10g使用了BUCKETS的设置,而且USER_TAB_COLUMNS添加了一个字段HISTOGRAM用来表示列的统计信息的类型。
FREQUENCY类型和以往的HEIGHT BALANCED类似的列统计不同。使用FREQUENCY类型,Oracle会选择与NUM_DISTINCT相同数量的NUM_BUCKETS来进行直方图统计,而直方图统计信息方式和基于高度的统计信息是不同的。最关键的是,这种统计方式的DENSITY的结果和HEIGHT BALANCED的计算方式大不相同。
因此在10g中,由于Oracle了解当前列的统计信息方式为FREQUENCY类型,因此可以根据直方图的信息得到正确的执行计划和返回记录数:
SQL>SELECTCOLUMN_NAME,NUM_DISTINCT,NUM_NULLS,DENSITY,NUM_BUCKETS,HISTOGRAM
2FROMUSER_TAB_COLUMNS
3WHERETABLE_NAME='ORD_HIT_COMM'
4ANDCOLUMN_NAME='ENABLE_FLAG';
COLUMN_NAMENUM_DISTINCTNUM_NULLSDENSITYNUM_BUCKETSHISTOGRAM
----------------------------------------------------------------------
ENABLE_FLAG202.8355E-072FREQUENCY
1rowselected.
SQL>EXPLAINPLANFOR
2SELECT*FROMORD_HIT_COMMWHEREENABLE_FLAG='1';
Explained.
SQL>SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|
-----------------------------------------------------------------------
|0|SELECTSTATEMENT||1691K|1200M|34103(2)|
|1|TABLEACCESSFULL|ORD_HIT_COMM|1691K|1200M|34103(2)|
-----------------------------------------------------------------------
11rowsselected.
但是如果将统计信息导入到920数据库中,就会存在严重的问题。由于9i的数据库中没有表示统计信息类型的HISTOGRAM列,因此即使是基于FREQUENCY类型的统计信息,也会被当作基于HEIGHT BALANCED类型的统计信息。
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
- ››Oracle中查找重复记录
- ››oracle修改用户登录密码
- ››Oracle创建删除用户、角色、表空间、导入导出等命...
- ››Oracle中登陆时报ORA-28000: the account is lock...
- ››Oracle数据库在配置文件中更改最大连接数
- ››Oracle中在pl/sql developer修改表的两种方式
更多精彩
赞助商链接