对于'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解和解释
- 博客分类:
- Oracle
db block get
s :
number of data blocks read in CURRENT mode ie) not in a read consistent
fashion, but the current version of the data blocks. 产生db_block_get
s的主要方式:
1.DML like Update, Delete will need to access the blocks in the current mode for modification.
2.Most data dictionary calls are done in CURRENT mode.
3.Buffers are often retrieved in current mode for INSERT, UPDATE, and
DELETE, and SELECT FOR UPDATE statements. Blocks must be requested in
current mode in order to be changed.
4.Also certain classes of blocks, like segment header blocks are always requested in current mode.
5. this will happen when you're doing a FULL TABLE SCAN on a table or a
FAST FULL SCAN on an index. In those cases, the segment header is read
(usually multiple times for some unknown reason) in current mode.
在current mode模式下产生的对block的访问叫db block get
s,这些block在SGA中,不需要访问硬盘。
db_block_get
s counts logical reads in CURRENT mode in the buffer cache and also includes direct read blocks (sort-on-disk) blocks.
.
consistent
get
s :
number of data blocks accessed in READ CONSISTENT mode. When a block is requested in consistent
mode, if any changes have been committed or made to that block since
the requesting statement (or transaction) began, then they must be
rolled back for the purposes of the read, to give a consistent
view of the data at that time.(当数据库是在consistent
mode模式下被请求的,则假如该数据块的数据修改是在查询语句发出之后被提交的,则此查询语句读到该数据块时,还必须为本次查询将数据回滚,得到查询语
句发出时该数据块的值,以便给查询给出一个与该查询有关的所有数据块的一致性视图,这也就是oracle所说的一致性读) In order to
maintain statement level read consistency, Oracle has to read the
blocks in a consistent
fashion(as of the snapshot SCN) and hence may fetch from rollback
segments , which is also added to this statistic. Buffers are usually
retrieved in consistent
mode for queries. 如普通的select语句、索引访问而引起的将数据读入到buffer中(也可能为physical read)或直接从buffer中读数据。注意,DML语句也能引起consistent
get
s,如update tab1 set col_b='Hello world' where col_a=1;,因为该语句需要找到需要被修改的所有数据块,在找数据块的过程中就会引起consistent
get
s。
在Read consistent
mode模式下产生的对block的访问叫consistent
get
s。
Session logical read is:
The sum of "db block get
s" plus "consistent
get
s".
db_block_changes:
db_block_changes counts modifications made to CURRENT blocks
'db block changes' = changes made to current blocks under LOGING (
UPDATE, INSERT, DELETE) + changes made to SORT blocks ( NOLOGING).
'consistent
changes' :
changes made to block for CONSISTENT READ and changes made to SORT blocks
physical reads :
Physical( disk and/or filesystem page cache) reads. Basically those
that cannot be satisfied by the cache and those that are direct reads.
Total number of data blocks read from disk. This number equals the
value of "physical reads direct" (direct from disk, excludes buffer
cache) plus all reads into buffer cache.
physical writes :
Total number of data blocks written to disk. This number equals the
value of "physical writes direct" (Number of writes directly to disk,
bypassing the buffer cache as in a direct load operation) plus all
writes from buffer cache.
要注意Oracle 的physical read 与 physical
writes并不总是等于硬盘真正意义上的物理读与物理写,因为现在都存在操作系统高速缓存与磁盘子系统高速缓存,这样及时I/O没有被实际写入磁盘,操
作系统I/O子系统或磁盘系统也会确认为一个成功的I/O,所以ORACLE 的physical read 与 physical
writes并不是物理上发生读写的次数。
redo block size:
redo block size is platform specific. There is a method to determine
the size by dumping the redo header, refer to note 154864.1. Redo
blocks written does not include archive writes or multiplexed writes.
redo entries:
The redo log buffer is a circular
buffer in the SGA that holds information about changes made to the
database. This information is stored in redo entries. Redo entries
contain the information necessary to reconstruct, or redo, changes made
to the database . Redo entries are used for database recovery, if
necessary.
Redo entries are copied by Oracle server processes from the user's
memory space to the redo log buffer in the SGA. (this copy is what the
statistic represents).
db block changes包含dml修改的block,也包含为实现rollback功能而修改的block,但是不包含为实现redo功能而修改的block。
the number of blocks visited = consistent
get
s + db block get
s
the number of blocks visited相当与logical read,即从内存中都数据块的次数。
做一个测试:
用下面语句取得统计信息:
select sid,value,name from v$sesstat x,v$statname y
where x.statistic#=y.statistic#
and ( name like '%db block%get
s%' or name like '%consistent
%get
s%'
or name like '%consistent
%change%' or name like '%db block%change%'
or name like '%physical writes%' or name like '%physical reads%'
or name = 'index fetch by key' or name like '%read%' or name like '%scans%'
)
and sid = 12 and value > 0
order by value;
Lets take an example to illustrate relationship between 'db block get
s' and 'db block changes' .
create table toto( i number);
select sid,value,name from v$sesstat x,v$statname y
where x.statistic#=y.statistic#
and ( name like '%db block%get
s%' or name like '%consistent
%get
s%'
or name like '%consistent
%change%' or name like '%db block%change%'
or name like '%physical writes%' or name like '%physical reads%'
or name = 'index fetch by key' or name like '%read%' or name like '%scans%'
)
and sid = 12 and value > 0
order by value;
SID VALUE NAME
---------- ---------- ------------------------------
11 95 db block get
s
11 108 db block changes
11 0 consistent
changes
select count(*) from toto x, toto y, toto z;
COUNT(*)
----------
0
select sid,value,name from v$sesstat x,v$statname y
where x.statistic#=y.statistic#
and ( name like '%db block%get
s%' or name like '%consistent
%get
s%'
or name like '%consistent
%change%' or name like '%db block%change%'
or name like '%physical writes%' or name like '%physical reads%'
or name = 'index fetch by key' or name like '%read%' or name like '%scans%'
)
and sid = 11 and value > 0
order by value
SID VALUE NAME
---------- ---------- ------------------------------
11 98 db block get
s
11 108 db block changes
11 0 consistent
changes
Here we can see that a select increment 'db block get
s' by 3 and 'db block changes' remains the same : this illustrates that we can get
block in current mode ( to have most recent information) without performing any changes." – 这也可以作为current mode的定义。
下面这段写的非常好,如果上面的还是不理解,则需要仔细的看一下!
A 'consistent
get
' is your server process telling the database "I need this dba (data block address) consistent
with the point in time represented by this SCN, x."
So, lots of things can happen here. First, Oracle will look in the buffer cache for a CR (consistent
read) buffer of the block that's consistent
w/ the requested SCN. It may find it, if it does, that's counted as a 'consistent
get
' and either a 'consistent
get
s - no work' or 'consistent
get
s
- cleanouts only', depending on whether the block needed to be cleaned
out. (See V$SYSSTAT/V$SESSTAT for the statistics.) If it doesn't, it
may take an existing CR buffer and roll it back further, or it may
clone the current block and roll it back. If it needs to apply rollback
(aka undo) then it will increment 'consistent
get
s' and either 'consistent
get
s - rollbacks only' or 'consistent
get
s - cleanouts and rollbacks'.
So, each 'consistent
get
' is your server process successfully get
ting access to the contents of a dba consistent
w/ a particular SCN. This number should represent the number of buffer get
s required to satisfy a particular query.
Now, 'db block get
s'. A 'db block get
'
is a copy of the 'current mode block'. That is, the data in the block,
as it exists currently, or at this point in time. Note that while
multiple CR copies of a block may exist in the buffer cache, there can
only ever be one current mode copy of a block in the buffer cache at
any one time. (RAC is a special case, w/ shared current and exclusive
current, but I'm not going to get
into that here.) So, a 'db block get
' is a buffer get
in current mode. 'db block get
s'
are usually associated w/ DML, and in that scenario, will implicitly
lock one or more rows in that block. Also, there is a notable case
where db block get
s can
occur with a select statement. That will happen when you're doing a
FULL TABLE SCAN on a table or a FAST FULL SCAN on an index. In those
cases, the segment header is read (usually multiple times for some
unknown reason) in current mode.
Next, 'physical reads': A physical read will occur any time a consistent
get
or a db block get
goes looking for block and can't find it in the buffer cache. So, for
each block read from disk, physical reads will be incremented. Gets
which result in physical reads are counted both as as get
and as a read in the statistics. So, if you do 10 consistent
get
s and 5 of them require physical reads, you should see consistent
get
s incremented by 10 and physical reads incremented by 5.
Now, what's up w/ arraysize? Well, arraysize is the client side setting
for SQL*Plus specifying the size of the array that will receive result
sets. The default, as you learned, is 15. Now, suppose you have a table
where there are 30 records per block, and 3,000 rows in the table. But,
your arraysize is 15. So, your server process will get
the first 15 rows, and return them from the first block buffer. Now, for the next 15, you need to get
that same block again, for rows 16-30. So, you need to do two buffer get
s per block to get
all the rows. For a 3,000 row table, you'll do (approximately) 3,000/15 = 200 buffer get
s. If you change your arraysize to 30, you can get
away w/ visitng each block only once and do 3,000/30 = 100 buffer get
s.
So, consider that even after you've optimized a particular SQL
statement, if the arraysize is too small, you're going to force your
server process to do excess database calls (FETCH calls), and extra
buffer get
s
as well. This can best be illustrated with a test similar to what you
did, but try looking at the raw trace file for FETCH calls. The number
of FETCH calls ought to be very close to (number of rows returned /
arraysize). The 'r=xxx' in the FETCH call data in the trace file is the
number of rows returned, which is probably what your arraysize is set
to.
So, db block get
s, consistent
get
s,
and physical reads are all measured in buffers (or blocks). If the same
block is requested multiple times, it will be counted that many times
in these statistics. Oracle will always access data from the buffer
cache by the buffer. All 'get
' operations are by the buffer, never by row. After the buffer is 'gotten', Oracle parses the block to get
the data for the relevant rows.
When a "consistent
get
" is done, this doesn't necessarily mean that Oracle had to do any rollback/undo of DML in order to get
the consistent
image. Rather, it just means that Oracle requested a copy of the block as of the point in time that the query was started (a "consistent
snapshot"). So, I believe it is quite normal to have many, many consistent
get
s even if there is NO DML occuring.
自己做的一个更详细的测试:
用到的查询统计信息的语句;
select sid,value,name from v$sesstat x,v$statname y
where x.statistic#=y.statistic#
and ( name like '%db block%get
s%' or name like '%consistent
%get
s%'
or name like '%consistent
%change%' or name like '%db block%change%'
or name like '%physical writes%' or name like '%physical reads%'
or name = 'index fetch by key' or name like '%read%' or name like '%scans%'
)
and sid = 11 and value > 0
order by value
Scott用户登录,但是没有做任何操作,sid为10,在另外一个用户下查询:
SID VALUE NAME
---------- ---------- --------------------------------
11 3 db block get
s
11 0 physical reads
11 4 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
在scott sid=11下运行select * from emp后,结果没有任何变化,这是不应该的,应该有physical reads与db block get
s的值变化
在scott sid = 11下运行update emp set comm = 10; 在另外一个用户下查询:
SID VALUE NAME
--------- ---------- ------------------------------
11 18 db block get
s
11 0 physical reads
11 33 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
再次在scott sid = 11的同一个session下运行update emp set comm = 10; 在另外一个用户下查询:
SID VALUE NAME
------- ---------- -------------------------------
11 32 db block get
s
11 0 physical reads
11 61 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
不要commit;
用scott再次登录, sid 为17,在另外一个用户下查询:
SID VALUE NAME
------- ---------- --------------------------------
17 3 db block get
s
17 0 physical reads
17 4 db block changes
17 0 consistent
changes
17 0 physical writes
17 0 physical writes non checkpoint
17 0 physical reads direct
17 0 physical writes direct
17 0 physical reads direct (lob)
17 0 physical writes direct (lob)
在scott session 17,下运行select * from emp 后,在另外一个用户下查询:
SID VALUE NAME
-------- ---------- --------------------------------
17 3 db block get
s
17 0 physical reads
17 5 db block changes
17 28 consistent
changes
17 0 physical writes
17 0 physical writes non checkpoint
17 0 physical reads direct
17 0 physical writes direct
17 0 physical reads direct (lob)
17 0 physical writes direct (lob)
再次在scott session 17,下运行select * from emp 后,在另外一个用户下查询:
SID VALUE NAME
----- ---------- ---------------------------------
17 3 db block get
s
17 0 physical reads
17 6 db block changes
17 56 consistent
changes
17 0 physical writes
17 0 physical writes non checkpoint
17 0 physical reads direct
17 0 physical writes direct
17 0 physical reads direct (lob)
17 0 physical writes direct (lob)
在此在scott sid = 11的同一个session下运行rollback; 在另外一个用户下查询:
SID VALUE NAME
------ ---------- ------------------------------
11 89 db block get
s
11 0 physical reads
11 118 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
再次在scott sid = 11的同一个session下运行update emp set comm = 10; 在另外一个用户下查询:
SID VALUE NAME
---- ---------- --------------------------------
11 104 db block get
s
11 0 physical reads
11 147 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
再次在scott sid = 11的同一个session下运行commit; 在另外一个用户下查询:
SID VALUE NAME
---- ---------- ------------------------------
11 105 db block get
s
11 0 physical reads
11 148 db block changes
11 0 consistent
changes
11 0 physical writes
11 0 physical writes non checkpoint
11 0 physical reads direct
11 0 physical writes direct
11 0 physical reads direct (lob)
11 0 physical writes direct (lob)
经过初步试验,发现如果开始运行select * from emp后,然后再运行select * from emp where empno = 7902, 不管运行多少此,都不会引起physical reads与db block get
s的增加。因为db block get
s是在current mode模式中产生的。
而是只会引起session logical reads与index fetch by key、consistent
get
s的增加。
如运行
select sid,value,name from v$sesstat x,v$statname y
where x.statistic#=y.statistic#
and ( name like '%db block%change%' or name like '%db block%get
%'
or name like '%consistent
%change%' or name like '%physical reads%'
or name like '%physical writes%' or name like '%scans%'
or name = 'index fetch by key' or name like '%read%'
)
and sid = 11 and value > 0
order by value
查询后,得到:
SID VALUE NAME
---- ---------- -------------------------------
11 3 db block get
s
11 4 db block changes
11 4 index scans kdiixs1
11 5 index fetch by key
11 6 table scans (short tables)
11 8 no work - consistent
read get
s
11 42 session logical reads
将数据库关闭,重新启动后,重新用scott联接,sid = 12立即查询统计信息,得到:
SID VALUE NAME
---- ---------- -------------------------------
12 6 db block get
s
12 6 table scans (short tables)
12 8 db block changes
12 53 cluster key scans
12 89 index fetch by key
12 145 physical reads
12 163 index scans kdiixs1
12 337 consistent
get
s - examination
12 423 no work - consistent
read get
s
12 945 consistent
get
s
12 951 session logical reads
在sid =12 session中运行select * from emp where empno = 7902;后,得到统计信息:
SID VALUE NAME
---- ---------- -------------------------------
12 6 db block get
s
12 6 table scans (short tables)
12 8 db block changes
12 60 cluster key scans
12 98 index fetch by key
12 150 physical reads
12 168 index scans kdiixs1
12 360 consistent
get
s - examination
12 439 no work - consistent
read get
s
12 990 consistent
get
s
12 996 session logical reads
再次运行select * from emp;则db block get
s与physical reads不发生变化
将数据库关闭,重新启动后,重新用scott联接,sid = 12立即查询统计信息,得到:
SID VALUE NAME
---- ---------- --------------------------------
12 6 db block get
s
12 6 table scans (short tables)
12 8 db block changes
12 53 cluster key scans
12 89 index fetch by key
12 145 physical reads
12 163 index scans kdiixs1
12 337 consistent
get
s - examination
12 423 no work - consistent
read get
s
12 945 consistent
get
s
12 951 session logical reads
在sid =12 session中运行select * from emp;后,得到统计信息:
SID VALUE NAME
--- ---------- -------------------------------
12 6 db block get
s
12 7 table scans (short tables)
12 8 db block changes
12 60 cluster key scans
12 97 index fetch by key
12 149 physical reads
12 168 index scans kdiixs1
12 358 consistent
get
s - examination
12 441 no work - consistent
read get
s
12 992 consistent
get
s
12 998 session logical reads
再次运行select * from emp;则db block get
s与physical reads不发生变化
转自:http://www.oracle.com.cn/viewthread.php?tid=102356&highlight=consistent%2Bget
发表评论
-
oracle根据外键名查关联的表
2010-10-17 09:35 12341、查找表的所有索引(包括索引名,类型,构成列): se ... -
ROLLUP和CUBE语句
2009-11-19 14:53 763Oracle的GROUP BY语句除了最基本的语法外,还支持 ... -
Oracle extent allocation: AUTOALLOCATE vs. UNIFORM
2009-10-10 13:07 2170Starting with Oracle 9i, DBAs c ... -
Oracle的物化视图
2009-09-15 13:17 1903create materialized view ... -
解决 'OraOLEDB.Oracle.1' provider is not registered
2009-04-02 11:00 14464解决方法如下: 到ORACLE_HOME目录,如c:\Ora ... -
项目管理
2009-02-06 11:39 01、已有功能的修改,都要先申请,申请的内容包括 a、改动原因: ... -
在Oracle9i中使用多种Block Size
2009-01-16 16:16 997来源:http://dev.21tx.com/2005/04 ... -
Oracle 存储层次体系
2009-01-16 15:36 969数据库由一个或者多个表空间(tablespace)构成。 一 ... -
Oracle分析函数over及开窗函数
2009-01-16 13:08 2602来源:http://www.365master.com/ma ... -
与对象权限有关的表与视图
2009-01-14 09:47 1308与对象权限有关的表与视图 DBA_TAB_PRIVS ... -
Storing settings for SQL*PLUS (login.sql and glogi
2009-01-13 16:33 983glogin.sql Whenever SQL*PLUS s ... -
autotrace 配置
2009-01-12 15:53 788Autotrace 的配置有很多种方法,下面是其中的 ... -
Oracle 常用命令
2009-01-12 15:17 915修改用户密码 alter user scott ident ... -
改变Oracle日期的输出格式
2009-01-09 12:45 1574查看数据库设置 select * from v$nl ... -
Oracle 语法之 OVER (PARTITION BY ..)
2008-12-31 12:34 1748Oracle 语法之 OVER (PARTITION BY . ... -
计算机改名后 ORACLE 监听不工作解决方法
2008-12-31 11:02 1798解决方法: 1. 修改 ...
相关推荐
SQL> SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS, 1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio" FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT'; 通常情况下,...
统计信息展示了 SQL 语句的执行情况,例如recursive calls、db block gets、consistent gets、physical reads 等;trace 信息展示了 SQL 语句的执行过程。 在分析 autotrace 结果时,需要关注的点包括: * 运行...
* 查看 Buffer Cache 的命中率,使用公式 1 - (physical reads cache / consistent gets from cache + db block gets from cache)计算。 * 在多 Buffer Pool 情况下,分别统计不同 Buffer Pool 的命中率。 * 查看...
- **计算公式**:`Hit Ratio = 1 - (physical reads / (db block gets + consistent gets))` - 当命中率低于60%~70%时,建议增加`db_block_buffers`的值以扩大缓冲区高速缓存的容量。 3. **调整方法** - `db_...
计算高速缓冲区命中率的公式为:Hit Ratio = 1 - (physical reads / (db block gets + consistent gets))。对于一般环境,命中率要求大于80%,而在UNIX环境下使用RAW DEVICE时,要求更高,需大于90%。如果命中率低于...
Autotrace Statistics 中有多个常用列,包括 db block gets、consistent gets、physical reads、redo size、sorts (memory) 和 sorts (disk) 等。 在使用 Autotrace 时,需要设置相关的命令,包括 SET AUTOTRACE ...
通过v$sysstat视图可以监测dbblock gets、consistent gets和physical reads这三个指标。缓冲区的命中率直接影响I/O性能。若物理读取(physical reads)过多,表明命中率低,需要调整缓冲区大小以减少磁盘I/O。 此外...
V$SYSSTAT中的consistent gets和db block gets统计了两种模式下的数据读取,而physical reads则记录了磁盘的物理读取。通过比较这些值,可以计算出命中率并作出相应的优化决策。 其次,共享池的调整至关重要。共享...
6. **SQL调整的关注点**:SQL的响应时间(包括DB Block Gets、Consistent Gets、Physical Reads和Sorts (Disk))是优化的主要关注点,这些指标反映了数据访问、一致性读取、物理I/O以及磁盘排序的开销。 7. **索引...
逻辑读是指从缓存(比如数据缓冲区高速缓存)中读取数据块,包括current reads(DB block gets)和consistent reads。物理读则涉及从磁盘加载数据块到内存。单块读(single block read)对应等待事件“db file ...
6. **SQL调整关注点**:优化SQL主要关注响应时间,包括DB Block Gets、Consistent Gets、Physical Reads以及Disk Sorts等指标,以减少I/O操作和提高查询效率。 7. **索引的理解**:索引分为B-Tree索引、Bitmap索引...
这些指标可以帮助我们判断SQL执行效率,比如如果DB Block Gets和Physical Reads的值很高,可能意味着缓存命中率低,需要进一步优化。 #### 二、索引的理解 索引是提高查询性能的关键技术之一,在Oracle数据库中...
SELECT round(1-SUM(PHYSICAL_READS)/(SUM(DB_BLOCK_GETS)+SUM(CONSISTENT_GETS)),4)*100 FROM (SELECT CASE WHEN NAME='physicalreads' THEN VALUE END PHYSICAL_READS, CASE WHEN NAME='dbblockgets' THEN VALUE ...
6. **SQL调整关注点**:关注SQL的响应时间,包括DB Block Gets、Consistent Gets、Physical Reads和Sorts (Disk),这些指标直接影响查询性能。 7. **索引的理解**:索引分为B-Tree索引、Bitmap索引、Function索引和...
计算命中率为:`1 - (physical reads / (db block gets + consistent gets))`。若命中率低于90%,则需增大缓冲区高速缓存的大小。 4. **大型池**:在shared server环境中,大型池用于存储各种共享资源。如果需要...
在调整数据缓冲区时,通过查询v$parameter视图来获取当前db_cache_size参数的大小,同时通过v$sysstat视图来监控db_block_gets(从内存读取的数据次数)、consistent_gets(读一致性数据次数)和physical_reads(从...
在Oracle数据库中,SQL执行计划对于理解SQL语句如何被执行至关重要。它详细地描述了数据库优化器为执行特定SQL语句所选择的路径。通过分析执行计划,DBA和开发人员可以更好地理解查询是如何被优化的,并且可以识别出...
查看该SQL的response time(db block gets/consistent gets/physical reads/sorts)。 六、索引 索引是数据库优化的重要手段。以下是索引相关的知识点: 1. 索引结构:b-tree index、bitmap index、function ...