`
byebyegov5qq
  • 浏览: 1207981 次
文章分类
社区版块
存档分类
最新评论

oracle之位图索引

 
阅读更多

位图索引适用于低基数(low-cardinality)列,所谓低基数列就是指这个列只有很少的可取值。

位图索引的问题:
采用位图索引,一个键指向多行,可能数以百计甚至更多。如果更新一个位图索引键,那么这
个键指向的数百条记录会与你实际更新的那一行一同被有效地锁定。

位图索引的适用场景:
位图索引是针对那些值不经常改变的字段的,在实际应用中,如果某个字段的值需要频繁更新,
那么就不适合在它上面创建位图索引。

以下为针对位图索引的实验:
1.准备环节:
--创建一个表t
SQL> create table t(processed_flag varchar2(1));

表已创建。

--在表t的processed_flag创建一个位图索引
SQL> create bitmap index t_idx on t(processed_flag);

索引已创建。

2.在一个sql*plus会话中插入一行列值为N的记录,且先不commit;然后在另一个sql*plus会话中也
插入一行列值为N的记录,这时发现后面的会话会被阻塞。
--session1
SQL> insert into t values('N');

已创建 1 行。
insert后不提交,则位图索引中的N键被锁住,任何DML语句只要与N有关都被阻塞

--session2
SQL> insert into t values('N');
该语句被挂起

--查询lock情况
这里有两个锁是正常的,因为任何DML操作都会产生锁,因为两个DML现在都没有commit,所以都会持有锁。
关键是看两个session的等待事件。可以看到前面的sid=146等待的是SQL*Net message from client,实际是
处于空闲等待,而sid=147等待的是enq: TX - row lock contention,其实是在等待sid=146释放其持有的锁
两个session持有的锁都为3-SX(Row-X)行级排它锁。
select t2.username,
t3.owner,
t3.object_name,
t2.machine,
t2.sid as sid,
t2.serial#,
t2.LAST_CALL_ET,
t2.program,
t1.locked_mode
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.OBJECT_ID = t3.object_id
order by t2.logon_time;

USERNAME OWNER OBJE MACHINE SID SERIAL# LAST_CALL_ET PROGRAMLOCKED_MODE
-------- -------- ---- ------------------------------ ---- ---------- ------------ -------------- ------------
SCOTT SCOTT T WORKGROUP\PC-200904261625 146 5 897 sqlplus.exe3
SCOTT SCOTT T WORKGROUP\PC-200904261625 147 12 894 sqlplus.exe3

已选择2行。


--列出指定 ID 的等待事件
可见前面的session sid=146在等待客户端输入,实际上就是等待commit命令,而sid=147则是在等待enq: TX - row lock contention
select SID,EVENT from v$session_wait where sid=147;

SQL> select SID,EVENT from v$session_wait where sid=147;

SID EVENT
---- ----------------------------------------------------------------
147 enq: TX - row lock contention

已选择 1 行。

SQL> select SID,EVENT from v$session_wait where sid=146;

SID EVENT
---- ----------------------------------------------------------------
146 SQL*Net message from client

已选择 1 行。

--查看当前被锁的 session 正在执行的 sql 语句
select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid,
a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"
from v$session a, v$lock b, v$sqltext c
where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value

USERNAME MACHINE SID SERIAL# Seconds ID1 SQL
-------- ------------------------------ ---- ---------- ---------- ---------- ----------------------
SCOTT WORKGROUP\PC-200904261625 147 12 3006 327724 insert into t values('N')

--session1 commit后,session2不再等待
SQL> insert into t values('N');

已创建 1 行。


3.在一个sql*plus会话中插入一行列值为N的记录,且先不commit;然后在另一个sql*plus会话中
插入一行列值为Y的记录,这时发现二者互不影响。
--session1
SQL> insert into t values('N');

已创建 1 行。
insert后不commit

--session2
SQL> insert into t values('Y');

已创建 1 行。
insert后不commit

--查看lockqingk
可见两个session都持有锁,那么二者的等待事件是什么呢
select t2.username,
t3.owner,
t3.object_name,
t2.machine,
t2.sid as sid,
t2.serial#,
t2.LAST_CALL_ET,
t2.program
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.OBJECT_ID = t3.object_id
order by t2.logon_time;

USERNAME OWNER OBJE MACHINE SID SERIAL# LAST_CALL_ET PROGRAM
-------- -------- ---- ------------------------------ ---- ---------- ------------ --------------
SCOTT SCOTT T WORKGROUP\PC-200904261625 147 12 114 sqlplus.exe
SCOTT SCOTT T WORKGROUP\PC-200904261625 146 23 108 sqlplus.exe

已选择2行。

--查看等待事件
可见两个session都处于空闲等待
SQL> select SID,EVENT from v$session_wait where sid=146;

SID EVENT
---- ----------------------------------------------------------------
146 SQL*Net message from client

已选择 1 行。

SQL> select SID,EVENT from v$session_wait where sid=147;

SID EVENT
---- ----------------------------------------------------------------
147 SQL*Net message from client

已选择 1 行。
分享到:
评论

相关推荐

    ORACLE四招提高位图索引

    提高ORACLE位图索引的四个方法,还不错,欢迎大家下载

    oracle位图索引

    oracle位图索引,讲解oracle的bitmap索引。

    Oracle 数据库的位图索引原理与应用.pdf

    Oracle 数据库的位图索引原理与应用.pdf

    位图索引在ORACLE中的应用.pdf

    位图索引在ORACLE中的应用.pdf

    oracle 位图索引内部探索

    Julian Dyke大牛作品,值得一看

    oracle 三种索引

    oracle 三种索引的简单描述,位图、B树、全文索引。

    ORACLE数据库索引工作原理

    通过两个图形说明了在oracle数据库中b-tree索引和位图索引的工作原理

    oracle索引分析与比较

    在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引 等。本文主要就前6种索引进行分析

    oracle使用索引与不使用索引的性能详析

    位图索引也是如此,仅仅只是是叶子节点不同B*数索引; 索引由根节点、分支节点和叶子节点组成。上级索引块包括下级索引块的索引数据,叶节点包括索引数据和确定行实际位置的rowid。 使用索引的目的: 加快查询速度 ...

    Oracle索引(B*tree与Bitmap)的学习总结

    在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引。(1)、与索引相关视图查询DBA_INDEXES视图可得到表中所有...

    索引优化原则及Oracle中索引总结

    Oracle索引建立原则  · 确定针对该表的操作是大量的查询操作还是大量的增删改操作。  · 尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。  · where语句中...

    oracle10g课堂练习I(1)

    位图索引 7-30 索引选项 7-32 创建索引 7-34 什么是视图 7-35 创建视图 7-36 序列 7-37 创建序列 7-38 使用序列 7-40 临时表 7-41 临时表:注意事项 7-43 数据字典:概览 7-44 数据字典视图 7-45 数据...

    ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解

    索引 索引与表一样,也属于段...从物理上说,索引通常可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引。 引言 本文主要给大家介绍了关于ORAC

    让Oracle跑的更快2第1-7章

    让Oracle跑的更快2第1-7章 第一章 分区 第二章 分区在海量数据库中的应用 第三章 树索引 第四章 位图索引 第五章 全文索引 第六章 对象属性概述 第七章 并行度

    Oracle 10g应用指导

    索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在案例精讲中,对表压缩、约束的使能与失能、表的层次结构查询、防止删除表及对象、提取创建外键约束的...

    索引创建维护

    Oracle索引回顾 B*索引 位图索引 函数索引 逆键索引 索引的维护

    Oracle DBA workshop1 (中文版)

    前言 1 简介 课程目标1-2 建议日程表1-3 课程目标1-4 Oracle 产品和服务1-5 Oracle Database 10g:“g”代表网格1-6 ...位图索引7-30 索引选项7-32 创建索引7-34 vi 什么是视图7-35 创建视图7-36 序列7-37 创建序列7-38

    oracle的sql优化

    必要可以采用位图索引  *存在递归查询情况如果关联Table太多对性能会造成较大影响,往往推荐采用临时表转为分步骤操作提高性能  *尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题...

Global site tag (gtag.js) - Google Analytics