Wednesday, January 7, 2009

database link产生锁和使用了回滚段的问题

database link产生锁和使用了回滚段的问题
运行环境: win2000 + ORACLE817

问题描述: 使用DBLINK后, SQL的运行效率会慢了

具体SQL如下:

--当前sid=8
SQL> select * from v$lock where sid=8;

未选定行

已用时间: 00: 00: 00.31
SQL> select usn,rssize,xacts from v$rollstat;

USN RSSIZE XACTS
---------- ---------- ----------
0 401408 0
1 4186112 1
2 4186112 0
3 4186112 0
4 4186112 0
5 52420608 0
6 4186112 0
7 4186112 0

已选择8行。

已用时间: 00: 00: 00.94


--运行带DBLINK的SQL
SQL> SELECT COUNT(*) FROM ALL_TABLES@TEST_DB;

COUNT(*)
----------
53

已用时间: 00: 00: 00.56


SQL> select * from v$lock where sid=8;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ----------
CTIME BLOCK
---------- ----------
0214C9F0 0214CABC 8 TX 393256 205 6 0
0 0

023895A0 023895B0 8 DX 9 0 4 0
0 0

--产生了TX和DX锁

已用时间: 00: 00: 00.94
SQL> select usn,rssize,xacts from v$rollstat;

USN RSSIZE XACTS
---------- ---------- ----------
0 401408 0
1 4186112 1
2 4186112 0
3 4186112 0
4 4186112 0
5 52420608 0
6 4186112 1
7 4186112 0

已选择8行。

--显示使用回滚段(USN=6)


--再运行带DBLINK的SQL
SQL> SELECT COUNT(*) FROM ALL_TABLES@TEST_DB;

COUNT(*)
----------
53

已用时间: 00: 00: 01.33



可以看到, 运行了带DBLINK的SQL后, 系统产生了TX和DX锁, 并使用了回滚段的资源, 再运行的话, 运行效率也变慢了, 请问这种情况的产生原因是什么? 还有有何解决途径?

使用dblink以后, Oracle使用2 phase commit, 会对远程的数据库持有DX锁. 哪怕是select语句也会持有锁, 开始一个事务.

具体信息, 自己看看Oracle concepts的distributed database的相关概念吧

No comments: