深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
来源:互联网 发布:淘宝微信营销方案 编辑:程序博客网 时间:2024/06/10 19:37
㈠ 先看两个来自生产环境的真实案例:
案例1
案例2
㈡ 原理:
Oracle 在对于 varchar等字符型字段收集统计信息时,并不会对每个值都进行精确的统计
而是,对值进行substr(,32)。一般来讲,这种方式没有什么问题
但是,如果恰巧列中存储的数据,前32bytes相同,那么,Oracle 的统计就会与实际情况不符
㈢ 测试:
hr@ORCL> drop table t purge;Table dropped.hr@ORCL> create table t (id number,name varchar2(300));Table created.hr@ORCL> create index idx_t on t (name);Index created.hr@ORCL> insert into t select rownum,lpad('a',6,'a')||to_char(rownum) from dba_objects;50322 rows created.hr@ORCL> commit;Commit complete.hr@ORCL> exec dbms_stats.gather_table_stats(user,'T',null,null,method_opt=>'for columns size 254 name',cascade=>true);PL/SQL procedure successfully completed.hr@ORCL> select column_name, endpoint_actual_value 2 from user_tab_histograms 3 where table_name = 'T' 4 and rownum<5 5 order by column_name, endpoint_Number;COLUM ENDPOINT_ACTUAL_VALUE----- --------------------------------------------------NAME aaaaaa46556NAME aaaaaa46734NAME aaaaaa46912NAME aaaaaa47090hr@ORCL> truncate table t;Table truncated.hr@ORCL> insert into t select rownum,lpad('a',31,'a')||to_char(rownum) from dba_objects;50322 rows created.hr@ORCL> exec dbms_stats.gather_table_stats(user,'T',null,null,method_opt=>'for columns size 254 name',cascade=>true);PL/SQL procedure successfully completed.hr@ORCL> select column_name, endpoint_actual_value 2 from user_tab_histograms 3 where table_name = 'T' 4 and rownum<5 5 order by column_name, endpoint_Number;COLUM ENDPOINT_ACTUAL_VALUE----- --------------------------------------------------NAME aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1NAME aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2NAME aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3NAME aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4hr@ORCL> truncate table t;Table truncated.hr@ORCL> insert into t select rownum,lpad('a',32,'a')||to_char(rownum) from dba_objects;50322 rows created.hr@ORCL> exec dbms_stats.gather_table_stats(user,'T',null,null,method_opt=>'for columns size 254 name',cascade=>true);PL/SQL procedure successfully completed.hr@ORCL> select column_name, endpoint_actual_value 2 from user_tab_histograms 3 where table_name = 'T' 4 and rownum<5 5 order by column_name, endpoint_Number;COLUM ENDPOINT_ACTUAL_VALUE----- --------------------------------------------------IDIDNAME
㈣ 解决方案:
删除索引列的直方图
例子:
SQL> begindbms_stats.gather_table_stats(ownname => 'HR', tabname => 'T' , estimate_percent => null , method_opt => 'for columns SIZE 1 name' , cascade => true);end;/
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- Oracle收集索引统计信息
- 收集对象统计信息【表、列、索引】
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- Oracle的索引类型
- oracle表不走索引,收集一下表的统计信息
- Oracle索引的理解
- Oracle收集统计信息和重建索引
- Oracle统计信息(表、索引)更新
- Oracle之查询索引、索引列等信息
- oracle重建、更新索引、索引统计信息命令
- ELasticSearch 深入理解系列5 -索引、类型
- Oracle中B-TREE索引的深入理解
- 深入理解Oracle索引(4):optimizer_index_cost_adj详解
- 深入理解Oracle索引(3):唯一索引和ROWID
- 深入理解Oracle索引(13):位图连接索引基础介绍
- 深入理解Oracle索引(24):B*Tree 索引小结
- [转载]PC宿主机和目标机通信方式
- Unity ios平台GPS地址位置定位
- hdu 1394(线段树)
- 网络地址
- ucosii在stm32上的移植详解2
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- Oracle利用sqlldr命令导入 XLS 文档
- 虚拟机VMware安装OracleRAC.RedHat Enterprise AS4安装Oracle10g RAC
- ucosii在stm32上的移植详解3
- Android开发使用MockObject进行测试代码
- 信息检索及信息过滤方法概述
- DevExpress "TextMgrP.dll" 加载错误
- makefile 中的 wildcard 与 patsubst 函数
- 云操作系统案例