对Oracle 并行的误解2--其实会锁全表

我一直以为Oracle只会锁住需要修改的数据,但在并行下是这样的,并行update是会锁全表的,下面的实验:

session1:

SQL> select sid from v$mystat where rownum=1;

SID

----------

11

SQL> select sid from v$mystat where rownum=1;

SQL> create table test as select * from dba_objects;

SQL> alter session force parallel dml;

SQL> update /*+parallel(t,4)*/  test t set object_name=‘ggg‘ where object_type=‘TABLE‘;

session2:

SQL> select sid from v$mystat where rownum=1;

SID

----------

8

SQL> update test t set object_name=‘ggg‘ where object_type=‘INDEX‘;--hang住

session3:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in(8,11) order by sid;

SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

8 TM        80189          0          0          3         61          0

8 AE          100          0          4          0       1871          0

11 TO        65927          1          3          0       1305          0

11 TX       196620       5212          6          0         64          0

11 PS            1          2          4          0         64          0

11 PS            1          3          4          0         64          0

11 TM        80189          0          6          0         64          1

11 PS            1          0          4          0         64          0

11 AE          100          0          4          0       2836          0

11 PS            1          1          4          0         64          0

SQL> select object_id,locked_mode from v$locked_object where session_id in(8,11);

OBJECT_ID LOCKED_MODE

---------- -----------

80189           6

80189           0

SQL> select sid,event from v$session_wait where wait_class <>‘Idle‘ and sid in(8,11);

SID EVENT

---------- -------------------------------------------------------------------------

8 enq: TM - contention

时间: 2024-11-05 21:56:52

对Oracle 并行的误解2--其实会锁全表的相关文章

oracle 性能优化操作十八: 决定使用全表扫描还是使用索引

和所有的秘笈一样,最后一招都会又回到起点,最后我们来讨论一下是否需要建立索引,也许进行全表扫描更快. 在大多数情况下,全表扫描可能会导致更多的物理磁盘输入输出,但是全表扫描有时又可能会因为高度并行化的存在而执行的更快. 如果查询的表完全没有顺序,那么一个要返回记录数小于10%的查询可能会读取表中大部分的数据块,这样使用索引会使查询效率提高很多. 但是如果表非常有顺序,那么如果查询的记录数大于40%时,可能使用全表扫描更快. 因此,有一个索引范围扫描的总体原则是: 1)对于原始排序的表  仅读取少

Oracle并行

1.Oracle服务器维护一个可用于并行操作的并行子进程池.数据库配置参数parallel_max_servers integer  和 parallel_min_servers integer 决定这个池的初始数和最大数,如果当前没有足够的子进程是活跃的,但池还没有达到最大值,则oracle将创建更多的子进程,经过一个设定的不活动周期,子进程将被关闭 SQL> show parameter parallel; NAME         TYPE  VALUE -----------------

Oracle并行添加主键的方法

环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL> alter table t add constraint pk_t primary key (object_id) using index online parallel 2; alter table t add constraint pk_t primary key (object_id) u

Oracle并行查询出错

1.错误描述 ORA-12801: 并行查询服务器P007中发出错误信号 ORA-01722:无效数字 12801.00000 -"error signaled in parallel query server %s" *Cause: A parallel query server reached an exception condition. *Action: Check the following error message for the cause,and consult yo

Oracle 并行案例解析

|   0 | SELECT STATEMENT         |          |   107 |  2782 |     3  (34)| 00:00:01 |        |      |            | |   1 |  PX COORDINATOR          |          |       |       |            |          |        |      |            | |   2 |   PX SEND QC

Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录是否满足WHERE语句的限制条件.ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描,而不是只读取一个数据块,这极大的减少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描.需要注意的是只有在全表扫描的情况下才能使用多块读操作.在这种

oracle全表扫描166G的表只花了6分钟

如何最大限制利用cpu?如何最快速的扫描完大表.如果大表有主键,count(*)就会走主键,oracle只需要扫描主键就能完成. 假设这个表没有主键,那么count(*)的时候只能走全表扫描,数据就非常慢.这里用full(a)强制走全表来模拟. --找100G以上的分区表 SQL> @getsegsize_big Enter value for tablespace_name: Enter value for owner: Enter value for how_big_m: 100000 OW

oracle在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)

实验环境:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 1.创建表插入数据 SQL> create table txtx(id int,name char(2),tx char(3),id1 int,primary key(id,name,tx)); 表已创建. SQL> insert into txtx values(1,'tx','tx',1); 已创建 1 行. SQL> i

Oracle查询被锁的表及进程的方法

Oracle查询可以有多种方法,下面为您介绍的是如何Oracle查询被锁的表及Oracle查询连接的进程的方法,希望对您能够有所帮助. 一.查看被锁的表 select p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a