Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154667
  • 博文数量: 39
  • 博客积分: 825
  • 博客等级: 准尉
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-25 14:05
文章分类

全部博文(39)

文章存档

2014年(4)

2013年(13)

2012年(22)

我的朋友

分类: Oracle

2012-11-16 18:12:58


【创建测试表】

 

DROP TABLE t PURGE;
create table t TABLESPACE dict_tbs as select * from all_objects ;

--建立索引(前导列基数低)
create index t_index1 on t(owner,object_name);

--收集统计信息
BEGIN
  dbms_stats.gather_table_stats(ownname          => USER,
                                tabname          => 't',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size 1',
                                cascade          => TRUE);
END;
/

--查看统计信息
SELECT utcs.num_distinct
FROM   user_tab_col_statistics utcs
WHERE  utcs.table_name = 'T' AND
       utcs.column_name IN('OWNER','OBJECT_NAME');
--24 29627

SELECT data_object_id, created FROM t WHERE object_name = 'DBA_EXTENTS';

 

【创建前导列基数相对较高的列】

 

drop index t_index1;
create index t_index1 on t (object_name,owner);

--收集统计信息
SELECT * FROM t WHERE owner = 'SCOTT';
BEGIN
  dbms_stats.set_column_stats(ownname       => USER,
                              tabname       => 't',
                              colname       => 'object_name',
                              distcnt       => 2,
                              no_invalidate => FALSE);
  dbms_stats.set_column_stats(ownname       => USER,
                              tabname       => 't',
                              colname       => 'owner',
                              distcnt       => 56660,
                              no_invalidate => FALSE);
END;
/

SELECT * FROM t WHERE owner = 'SCOTT';

 

  【结论】


 
网上说索引跳跃式扫描的机制,其实是将原sql重写成使用前导列的union
语句,但是我从10046和10053跟踪文件中都未找到,从实验结果看,似乎是这样的。 

阅读(619) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~