楼主: vage

[精华] 揭密Oracle之七种武器之四:揭密Buffer Cache中的链表

[复制链接]
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
61#
发表于 2012-8-29 14:14 | 只看该作者
楼主,请教个问题:
搜索Hash Chain是需要cache buffer chain Latch的保护,如果不保护会有什么问题呢?也就是cache buffer chain Latch到底在保护什么?

使用道具 举报

回复
论坛徽章:
0
62#
发表于 2012-8-29 14:35 | 只看该作者
高手!

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
63#
 楼主| 发表于 2012-8-30 08:40 | 只看该作者
liuxuelong007 发表于 2012-8-29 14:14
楼主,请教个问题:
搜索Hash Chain是需要cache buffer chain Latch的保护,如果不保护会有什么问题呢?也 ...

只要是共享的东西,访问的时候都需要某种锁机制保护。
SGA内存的每一个字节,都是共享的。因此进程哪怕是只访问SGA中一个字节,都需要某种锁机制保护。
Oracle这种锁机制就是Latch和Mutex。

具体到CBC Latch,它保护各个HASH Bukect后的链表,另外,它还保护buffer Pin的获取、释放。
(Buffer Pin也是内存中的N个字节,CBC Latch保护对这几个字节的修改)

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
64#
发表于 2012-8-30 10:52 | 只看该作者
vage 发表于 2012-8-30 08:40
只要是共享的东西,访问的时候都需要某种锁机制保护。
SGA内存的每一个字节,都是共享的。因此进程哪怕是 ...

谢谢楼主的回复,我还有个问题,CBC Latch保护buffer Pin的获取、释放这个我能理解,因为要修改数据了,所以只能有一个用户进程在访问。
但是如果有两个用户进程,只是读取数据,而不对数据进行修改,那这两个用户进程同时扫描hash bukect后的一个链表,同时找到一个相同buffer header,然后同时读取数据,但不做修改,这会有什么问题呢?

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
65#
 楼主| 发表于 2012-8-30 16:54 | 只看该作者
liuxuelong007 发表于 2012-8-30 10:52
谢谢楼主的回复,我还有个问题,CBC Latch保护buffer Pin的获取、释放这个我能理解,因为要修改数据了,所 ...

任何锁机制,都会有额外代价的。
最最简单的锁,没有独占、共享这些模式,只有持有、不持有,没有等待者队列这些高级特性,只有这样,锁的获得、释放,才迅速、占资源少。这就是Latch了。

但Latch发展到9i,已经有了队列Latch,也叫长Latch。到11G,绝大多数Latch都是长Latch,有简单的队列。为了简洁高效,10G后Oracle又搞了个Mutex。

虽然Latch有队列,有共享、独占模式的Latch,仍只是一少部分,被称为共享Latch。比如CBC Latch就是,但CBC Latch,大部分时候,也是以独占模式持有的,关于这个问题,可以参考我原来的帖子:
揭密Oracle之七种武器之三:破译古老的谜题---共享CBC Latch的秘密
http://www.itpub.net/thread-1617245-1-1.html

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
66#
发表于 2012-9-11 13:12 | 只看该作者
楼主,您什么时候出五啊~!!

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
67#
发表于 2012-9-11 15:34 | 只看该作者
楼主,您好:
我做了如下实验,进行三次全表扫描,是11.2.0.3的库,您不是说11g全表扫描是不会把buffer header移动到主lru链表上吗?那为什么我的实验结果不太一样呢?
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> show sga;
Total System Global Area  238530560 bytes
Fixed Size                  1344144 bytes
Variable Size             155192688 bytes
Database Buffers           79691776 bytes
Redo Buffers                2301952 bytes

SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='A3_76M';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
A3_76M                  72

SQL> alter system flush buffer_cache;
System altered.
SQL> select cnum_set,cnum_repl,anum_repl,cnum_write,anum_write from x$kcbwds;

  CNUM_SET  CNUM_REPL  ANUM_REPL CNUM_WRITE ANUM_WRITE
---------- ---------- ---------- ---------- ----------
         0          0          0          0          0
         0          0          0          0          0
      9424       9424       9422          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0

8 rows selected.

SQL> set autotrace on
SQL> select count(*) from a3_76m;
  COUNT(*)
----------
   3000000
Execution Plan
----------------------------------------------------------
Plan hash value: 3908218

---------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |  2447   (1)| 00:00:30 |
|   1 |  SORT AGGREGATE    |        |     1 |            |          |
|   2 |   TABLE ACCESS FULL| A3_76M |  2938K|  2447   (1)| 00:00:30 |
---------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      17802  consistent gets
       8954  physical reads
          0  redo size
        423  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from a3_76m;
  COUNT(*)
----------
   3000000
Execution Plan
----------------------------------------------------------
Plan hash value: 3908218

---------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |  2447   (1)| 00:00:30 |
|   1 |  SORT AGGREGATE    |        |     1 |            |          |
|   2 |   TABLE ACCESS FULL| A3_76M |  2938K|  2447   (1)| 00:00:30 |
---------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      17802  consistent gets
       8951  physical reads
          0  redo size
        423  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from a3_76m;
  COUNT(*)
----------
   3000000
Execution Plan
----------------------------------------------------------
Plan hash value: 3908218

---------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |  2447   (1)| 00:00:30 |
|   1 |  SORT AGGREGATE    |        |     1 |            |          |
|   2 |   TABLE ACCESS FULL| A3_76M |  2938K|  2447   (1)| 00:00:30 |
---------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      17802  consistent gets
       8951  physical reads
          0  redo size
        423  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> set autotrace off
SQL> select cnum_set,cnum_repl,anum_repl,cnum_write,anum_write from x$kcbwds;

  CNUM_SET  CNUM_REPL  ANUM_REPL CNUM_WRITE ANUM_WRITE
---------- ---------- ---------- ---------- ----------
         0          0          0          0          0
         0          0          0          0          0
      9424       9424       9111          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0
         0          0          0          0          0

8 rows selected.

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
68#
 楼主| 发表于 2012-9-11 22:59 | 只看该作者
liuxuelong007 发表于 2012-9-11 15:34
楼主,您好:
我做了如下实验,进行三次全表扫描,是11.2.0.3的库,您不是说11g全表扫描是不会把buffer he ...

11GR2又变了,Oracle对全表扫描又进行了限制,即使主LRU为空,全表扫描的Buffer,也不会被链接到主LRU,只能在辅助LRU内打转。

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
69#
 楼主| 发表于 2012-9-11 23:00 | 只看该作者
liuxuelong007 发表于 2012-9-11 13:12
楼主,您什么时候出五啊~!!

是出书吗?
明年3月份定稿。

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
70#
发表于 2012-9-12 09:12 | 只看该作者
vage 发表于 2012-9-11 22:59
11GR2又变了,Oracle对全表扫描又进行了限制,即使主LRU为空,全表扫描的Buffer,也不会被链接到主LRU,只 ...

楼主,那这个跟我实验的结果不一样啊~!!
我是连续进行三次全表扫描,发现有少量的buffer被链接到了主LRU上啊~!!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表