oracle位图索引语句,oracle之位图索引

oracle位图索引语句,oracle之位图索引位图索引适用于低基数 low cardinality 列 所谓低基数列就是指这个列只有很少的可取值 位图索引的问题 采用位图索引 一个键指向多行 可能数以百计甚至更多 如果更新一个位图索引键 那么这个键指向的数百条记录会与你实际更新的那一行一同被有效地锁定 位图索引的适用场景 位图索引是针对那些值不经常改变的字段的 在实际应用中 如果某个字段的值需要频繁更新 那么就不适合在它上面创建位图索引 以下

位图索引适用于低基数(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 PROGRAM    LOCKED_MODE

——– ——– —- —————————— —- ———- ———— ————– ————

SCOTT    SCOTT    T    WORKGROUP\PC-5       146          5          897 sqlplus.exe  3

SCOTT    SCOTT    T    WORKGROUP\PC-5       147         12          894 sqlplus.exe  3

已选择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-5       147         12       3006     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-5       147         12          114 sqlplus.exe

SCOTT    SCOTT    T    WORKGROUP\PC-5       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 行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201912.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:19
下一篇 2026年3月20日 上午8:19


相关推荐

  • html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)「建议收藏」

    html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)「建议收藏」空格的代码(【html5空格代码怎么写】),哪吒游戏网给大家带来详细的空格的代码(【html5空格代码怎么写】)介绍,大家可以阅读一下,希望这篇空格的代码(【html5空格代码怎么写】)可以给你带来参考价值。6.不要应用with,void,eval。每行释注的释注符后要加一个空格后才写解注,如://MynameisCKJ.1.单行释注:用“//”标注,注意免避无意义的释注。2….

    2026年2月15日
    5
  • jvm垃圾回收算法有哪些_jvm垃圾回收过程

    jvm垃圾回收算法有哪些_jvm垃圾回收过程JVM垃圾回收算法两个概念:新生代:存放生命周期较短的对象的区域。老年代:存放生命周期较长的对象的区域。相同点:都在Java堆上1.标记–清除算法执行步骤:标记:遍历内存区域,对需要回收的对象打上标记。清除:再次遍历内存,对已经标记过的内存进行回收。图解:缺点:效率问题;遍历了两次内存空间(第一次标记,第二次清除)。空间问题:容易产生大量内存碎片,当再需要一块比…

    2025年10月28日
    4
  • 常用网管工具_网管系统

    常用网管工具_网管系统1、ping(你懂的)2、df-h(查看磁盘使用情况)3、top(查看cpu使用情况,按“1”可以查看各个cpu详情)4、pstree(树形显示进程及同名进程的数量)5、vmstat[m][n](显示服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。间隔m秒钟显示一次,一共显示n次)6、nload(监视网络吞吐量)7、ps…|grep

    2022年10月6日
    3
  • execute,executeQuery和executeUpdate的区别

    execute,executeQuery和executeUpdate的区别在jdbc中有3种执行sql的语句分别是execute,executeQuery和executeUpdateexecute执行增删改查操作execute返回的结果是个boolean型,当返回的是true的时候,表明有ResultSet结果集,通常是执行了select操作,当返回的是false时,通常是执行了insert、update、delete等操作。execute通常用于执行不明确的s

    2022年10月19日
    9
  • 4hutool源码分析:DateUtil(时间工具类)-格式化时间(万字长文源码分析,学大佬如何写代码)[通俗易懂]

    4hutool源码分析:DateUtil(时间工具类)-格式化时间(万字长文源码分析,学大佬如何写代码)[通俗易懂]知其然,知其所以然:4hutool源码分析:DateUtil(时间工具类)-格式化时间

    2025年7月3日
    2
  • 扣子空间创建工作流教程:小白也能懂!

    扣子空间创建工作流教程:小白也能懂!

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号