有关位图连接索引(bitmap join index)的一些测试

本文探讨了在数据库中创建和使用位图连接索引的过程,并通过实例展示了位图连接索引的创建、使用及性能影响。在测试过程中,发现优化器在某些情况下不会选择使用位图连接索引,尽管它能降低逻辑IO。文章还讨论了如何通过调整统计信息和强制使用索引来影响执行计划,以及位图连接索引在特定场景下可能无法避免排序操作的问题。最后,文章指出位图连接索引在OLTP系统中可能存在的锁扩展会对性能造成影响。
摘要由CSDN通过智能技术生成

数据库版本:10.2.0.4

create table zsj_obj as select owner,object_id from dba_objects where object_id is not null;

create table zsj_obj_detail pctfree 90
as select object_id,object_name,object_type,last_ddl_time+rownum last_ddl_time,status
from dba_objects where object_id is not null;

alter table zsj_obj_detail add constraint pk_zsj_obj_detail primary key(object_id);

create bitmap index ind_zsj_obj_detail
on zsj_obj_detail(o.owner)
from zsj_obj o,zsj_obj_detail d
where o.object_id=d.object_id;

指向zsj_obj_detail的数据行.where子句中必须连接另一个表zsj_obj的主键或者是唯一键.如果zsj_obj是复合主键的话,where子句中必须包含zsj_obj的所有主键列.

create bitmap index ind_zsj_obj_detail
on zsj_obj_detail(o.owner)
from zsj_obj o,zsj_obj_detail d
where o.object_id=d.object_id
ORA-25954: missing primary key or unique constraint on dimension
这里报错了,因为zsj_obj的object_id不是主键也不是唯一键
,虽然说zsj_obj_detail的object_id是主键吧,但那不是我这里要求的.

alter table zsj_obj_detail drop constraint pk_zsj_obj_detail;  我把zsj_obj_detail上的主键给去掉了
alter table zsj_obj add constraint pk_zsj_obj primary key(object_id);  加上了zsj_obj的主键约束
SQL> desc zsj_obj;
Name      Type         Nullable Default Comments
--------- ------------ -------- ------- --------
OWNER     VARCHAR2(30) Y                        
OBJECT_ID NUMBER                                 
SQL> desc zsj_obj_detail;
Name          Type          Nullable Default Comments
------------- ------------- -------- ------- --------
OBJECT_ID     NUMBER        Y                        
OBJECT_NAME   VARCHAR2(128) Y                        
OBJECT_TYPE   VARCHAR2(19)  Y                        
LAST_DDL_TIME DATE          Y                        
STATUS        VARCHAR2(7)   Y      

这样就可以创建上面的位图连接索引了:
create bitmap index ind_zsj_obj_detail
on zsj_obj_detail(o.owner)
from zsj_obj o,zsj_obj_detail d
where o.object_id=d.object_id;

Index created
索引创建成功了.

SQL> SELECT INDEX_TYPE,join_index,TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME=UPPER('ind_zsj_obj_detail');
INDEX_TYPE                  JOIN_INDEX TABLE_NAME
--------------------------- ---------- ------------------------------
BITMAP                      YES        ZSJ_OBJ_DETAIL
这里显示是zsj_obj_detail表上的索引.

exec dbms_stats.gather_table_stats(user,'ZSJ_OBJ',cascade=>true,estimate_percent=>100,method_opt=>'for columnS OWNER SIZE 254,OBJECT_ID SIZE 1');
exec dbms_stats.gather_table_stats(user,'ZSJ_OBJ_DETAIL',cascade=>true,estimate_percent=>100,method_opt=>'for all columnS size 1');
分析表zsj_obj_detail连带它的索引也分析的时候,ind_zsj_obj_detail也被分析了,可以知道这个索引确实是zsj_obj_detail这个表的索引.

SQL> SELECT OWNER,COUNT(1) CNT FROM ZSJ_OBJ GROUP BY OWNER ORDER BY CNT DESC;
OWNER                                 CNT
------------------------------ ----------
SYS                                 23328
......
TSMSYS                                  3
 
21 rows selected
 
SQL> select TABLE_NAME,COLUMN_NAME,NUM_BUCKETS,HISTOGRAM from User_Tab_Columns where table_name in('ZSJ_OBJ','ZSJ_OBJ_DETAIL');
TABLE_NAME                     COLUMN_NAME                    NUM_BUCKETS HISTOGRAM
------------------------------ ------------------------------ ----------- ---------------
ZSJ_OBJ                        OWNER                                   21 FREQUENCY
ZSJ_OBJ                        OBJECT_ID                                1 NONE
ZSJ_OBJ_DETAIL                 OBJECT_ID                                1 NONE
ZSJ_OBJ_DETAIL                 OBJECT_NAME                              1 NONE
ZSJ_OBJ_DETAIL                 OBJECT_TYPE                              1 NONE
ZSJ_OBJ_DETAIL                 LAST_DDL_TIME                            1 NONE
ZSJ_OBJ_DETAIL                 STATUS                                   1 NONE
 
7 rows selected

select COUNT(1)
from

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值