Oracle中ASSM模式下,全表掃描的L3塊的邏輯讀的影響
前言:
本問題由之前的實驗擴充遺留的一些疑問,詳見:http://blog.itpub.net/30174570/viewspace-2140241/。
排除db_file_multiblock_read_count引數和動態取樣(詳見:http://blog.itpub.net/30174570/viewspace-2140240/)的影響。
作業系統環境:
資料庫版本:
構造測試資料:
引出問題:
sql語句"select count(*) from t where rownum<=171"只讀取了131,132兩個塊,但是130也被讀取進去,這裡讀取該塊的作用是什麼?
實驗過程:
上述實驗過程第9行處,得出段頭塊是130號塊,在ASSM中,段頭是第一個L3塊。
為什麼該處的邏輯讀是4呢?全表掃描下,會跳過L1(塊128)和L2(塊129),直接讀取段頭L3和高水位線以下的所有塊(為什麼全表掃描只讀了131和132,受到rownum的影響,詳情見http://blog.itpub.net/30174570/viewspace-2140240/)。但是L3要讀取兩次,所以邏輯讀為4。讀取L3兩次,一次讀取Extent Map,一次讀取Auxillary Map。
回到一開始的問題,Oracle通過讀取L3段頭塊確定全表掃描應該讀取的區和區中的資料塊,這個就是為什麼除了131和132這兩個實際包含資料的資料塊以外,還要讀取130塊的原因。
資料塊130的部分dump資訊:
其他擴充:
本問題由之前的實驗擴充遺留的一些疑問,詳見:http://blog.itpub.net/30174570/viewspace-2140241/。
排除db_file_multiblock_read_count引數和動態取樣(詳見:http://blog.itpub.net/30174570/viewspace-2140240/)的影響。
作業系統環境:
-
[oracle@oracle ~]$ uname -a
-
Linux oracle.example.com 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
-
[oracle@oracle ~]$ lsb_release -a
-
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
-
Distributor ID: RedHatEnterpriseServer
-
Description: Red Hat Enterprise Linux Server release 6.5 (Santiago)
-
Release: 6.5
- Codename: Santiago
資料庫版本:
-
SYS@proc> select * from v$version where rownum=1;
-
-
BANNER
-
--------------------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
構造測試資料:
-
SYS@proc> drop table t purge;
-
-
Table dropped.
-
-
SYS@proc> create table t as select * from dba_objects where rownum<=1200;
-
-
Table created.
-
-
SYS@proc> alter table t move tablespace test;
-
-
Table altered.
-
-
SYS@proc> select dbms_rowid.rowid_block_number(rowid) block#,min(rownum),max(rownum) from t group by dbms_rowid.rowid_block_number(rowid) order by dbms_rowid.rowid_block_number(rowid);
-
-
BLOCK# MIN(ROWNUM) MAX(ROWNUM)
-
---------- ----------- -----------
-
131 1 88
-
132 89 171
-
133 172 251
-
134 252 329
-
135 330 407
-
136 408 487
-
137 488 567
-
138 568 646
-
139 647 724
-
140 725 798
-
141 799 873
-
-
BLOCK# MIN(ROWNUM) MAX(ROWNUM)
-
---------- ----------- -----------
-
142 874 946
-
143 947 1022
-
145 1023 1104
-
146 1105 1179
-
147 1180 1200
-
-
16 rows selected.
-
-
SYS@proc> select EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where owner='SYS' and SEGMENT_NAME='T';
-
-
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
-
---------- ---------- ---------- ----------
-
0 6 128 8 --128 129 130 131 132 133 134 135
-
1 6 136 8
- 2 6 144 8
引出問題:
-
SYS@proc> alter system set db_file_multiblock_read_count=1; --避免該引數的影響
-
-
System altered.
-
-
SYS@proc> show parameter db_file_multiblock_read_count
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
- db_file_multiblock_read_count integer 1
-
-
SYS@proc> analyze table t compute statistics; --避免動態取樣的影響
-
-
Table analyzed.
-
-
SYS@proc> alter system flush buffer_cache;
-
-
System altered.
-
-
SYS@proc> select file#,dbablk,state from x$bh where obj=(select data_object_id from dba_objects where owner='SYS' and object_name='T') and state<>0 order by dbablk;
-
-
no rows selected
-
-
SYS@proc> select count(*) from t where rownum<=171;
-
-
COUNT(*)
-
----------
-
171
-
-
SYS@proc> select file#,dbablk,state from x$bh where obj=(select data_object_id from dba_objects where owner='SYS' and object_name='T') and state<>0 order by dbablk;
-
-
FILE# DBABLK STATE
-
---------- ---------- ----------
-
6 130 1
-
6 131 1
- 6 132 1
實驗過程:
-
SYS@proc> alter system flush buffer_cache;
-
-
System altered.
-
-
SYS@proc> select file#,dbablk,state from x$bh where obj=(select data_object_id from dba_objects where owner='SYS' and object_name='T') and state<>0 order by dbablk;
-
-
no rows selected
-
-
SYS@proc> select HEADER_FILE,HEADER_BLOCK from dba_segments where owner='SYS' and segment_name='T'; --該語句可確定段頭塊是130
-
-
HEADER_FILE HEADER_BLOCK
-
----------- ------------
-
6 130
-
-
SYS@proc> select file#,dbablk,state from x$bh where obj=(select data_object_id from dba_objects where owner='SYS' and object_name='T') and state<>0 order by dbablk;
-
-
no rows selected
-
-
SYS@proc> select count(*) from t where rownum<=171;
-
-
COUNT(*)
-
----------
-
171
-
-
SYS@proc> set autotrace on
-
SYS@proc> select count(*) from t where rownum<=171;
-
-
COUNT(*)
-
----------
-
171
-
-
-
Execution Plan
-
----------------------------------------------------------
-
Plan hash value: 239743108
-
-
--------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-
--------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 21 (0)| 00:00:01 |
-
| 1 | SORT AGGREGATE | | 1 | | |
-
|* 2 | COUNT STOPKEY | | | | |
-
| 3 | TABLE ACCESS FULL| T | 1200 | 21 (0)| 00:00:01 |
-
--------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
2 - filter(ROWNUM<=171)
-
-
-
Statistics
-
----------------------------------------------------------
-
0 recursive calls
-
0 db block gets
-
4 consistent gets
-
0 physical reads
-
0 redo size
-
527 bytes sent via SQL*Net to client
-
523 bytes received via SQL*Net from client
-
2 SQL*Net roundtrips to/from client
-
0 sorts (memory)
-
0 sorts (disk)
-
1 rows processed
-
-
SYS@proc> set autotrace off
-
SYS@proc> select file#,dbablk,state from x$bh where obj=(select data_object_id from dba_objects where owner='SYS' and object_name='T') and state<>0 order by dbablk;
-
-
FILE# DBABLK STATE
-
---------- ---------- ----------
-
6 130 1
-
6 131 1
- 6 132 1
為什麼該處的邏輯讀是4呢?全表掃描下,會跳過L1(塊128)和L2(塊129),直接讀取段頭L3和高水位線以下的所有塊(為什麼全表掃描只讀了131和132,受到rownum的影響,詳情見http://blog.itpub.net/30174570/viewspace-2140240/)。但是L3要讀取兩次,所以邏輯讀為4。讀取L3兩次,一次讀取Extent Map,一次讀取Auxillary Map。
回到一開始的問題,Oracle通過讀取L3段頭塊確定全表掃描應該讀取的區和區中的資料塊,這個就是為什麼除了131和132這兩個實際包含資料的資料塊以外,還要讀取130塊的原因。
資料塊130的部分dump資訊:
-
Extent Control Header
-
-----------------------------------------------------------------
-
Extent Header:: spare1: 0 spare2: 0 #extents: 3 #blocks: 24
-
last map 0x00000000 #maps: 0 offset: 2716
-
Highwater:: 0x01800094 ext#: 2 blk#: 4 ext size: 8
-
#blocks in seg. hdr's freelists: 0
-
#blocks below: 20
-
mapblk 0x00000000 offset: 2
-
Unlocked
-
--------------------------------------------------------
-
Low HighWater Mark :
-
Highwater:: 0x01800094 ext#: 2 blk#: 4 ext size: 8
-
#blocks in seg. hdr's freelists: 0
-
#blocks below: 20
-
mapblk 0x00000000 offset: 2
-
Level 1 BMB for High HWM block: 0x01800090
-
Level 1 BMB for Low HWM block: 0x01800090
-
--------------------------------------------------------
-
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
-
L2 Array start offset: 0x00001434
-
First Level 3 BMB: 0x00000000
-
L2 Hint for inserts: 0x01800081
-
Last Level 1 BMB: 0x01800090
-
Last Level II BMB: 0x01800081
-
Last Level III BMB: 0x00000000
-
Map Header:: next 0x00000000 #extents: 3 obj#: 89405 flag: 0x10000000
-
Inc # 0
-
Extent Map
-
-----------------------------------------------------------------
-
0x01800080 length: 8
-
0x01800088 length: 8
-
0x01800090 length: 8
-
-
Auxillary Map
-
--------------------------------------------------------
-
Extent 0 : L1 dba: 0x01800080 Data dba: 0x01800083 "0x01800083"->二進位制:00000001 10000000 00000000 10000011
-
Extent 1 : L1 dba: 0x01800080 Data dba: 0x01800088 前10位是檔案號,後22位是塊號,0000000110->檔案號:6,000000 00000000 10000011->資料塊:131
-
Extent 2 : L1 dba: 0x01800090 Data dba: 0x01800091
-
--------------------------------------------------------
-
-
Second Level Bitmap block DBAs
-
--------------------------------------------------------
-
DBA 1: 0x01800081
-
- End dump data blocks tsn: 9 file#: 6 minblk 130 maxblk 130
-
SYS@proc> select to_number('01800083','xxxxxxxx') from dual;
-
-
TO_NUMBER('01800083','XXXXXXXX')
-
--------------------------------
-
25165955
-
-
SYS@proc> select dbms_utility.data_block_address_file(25165955) from dual;
-
-
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(25165955)
-
----------------------------------------------
-
6
-
-
SYS@proc> select dbms_utility.data_block_address_block(25165955) from dual;
-
-
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(25165955)
-
-----------------------------------------------
- 131
其他擴充:
-
SYS@proc> --16進位制數0x01800080轉換為10進位制數
-
SYS@proc> select to_number('01800080','xxxxxxxx') from dual;
-
-
TO_NUMBER('01800080','XXXXXXXX')
-
--------------------------------
-
25165952
-
-
SYS@proc> --10進位制25165952轉換為16進位制
-
SYS@proc> select to_char(25165952,'xxxxxxxx') from dual;
-
-
TO_CHAR(2
-
---------
-
1800080
-
-
SYS@proc> --2進位制轉換為10進位制
-
SYS@proc> select bin_to_num(1,1,0,1) a,bin_to_num(1,0) b from dual;
-
-
A B
-
---------- ----------
-
13 2
-
-
SYS@proc> select bin_to_num(1,1,1,0,1) from dual;
-
-
BIN_TO_NUM(1,1,1,0,1)
-
---------------------
- 29
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30174570/viewspace-2140813/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- PostgreSQL DBA(55) - MVCC#8(對全表掃描的影響)SQLMVCC#
- MySQL中的全表掃描和索引樹掃描MySql索引
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- Oracle中rownum對錶的掃描方式效能上的影響深入探究Oracle
- oracle是如何進行全表掃描的Oracle
- 優化Oracle with全表掃描的問題優化Oracle
- delete 刪除資料 全表掃描還是掃描所有塊的測試delete
- ORACLE全表掃描查詢Oracle
- 優化Oracle with全表掃描的問題(二)優化Oracle
- 查詢全表掃描的sqlSQL
- oracle優化:避免全表掃描Oracle優化
- noworkload下全表掃描cost的計算
- 使用索引快速全掃描(Index FFS)避免全表掃描的若干場景索引Index
- oracle實驗記錄(分割槽全表掃描(全區掃描) FTS 時候的成本計算)Oracle
- Oracle中ASSM模式下,向表中插入資料後被cache在記憶體的資料塊OracleSSM模式記憶體
- stopkey對索引掃描的影響測試TopK索引
- 【效能】Oracle表並行對邏輯遷移後查詢效能的影響Oracle並行
- 抓取全表掃描的表,篩選和分析
- 關於分割槽表中的全partition掃描問題
- 索引全掃描和索引快速全掃描的區別索引
- 優化全表掃描優化
- delete 與全表掃描delete
- ORACLE空間管理實驗5:塊管理之ASSM下高水位的影響--刪除和查詢OracleSSM
- oracle 物理讀 邏輯讀的理解Oracle
- oracle 物理讀,邏輯讀的理解Oracle
- 一條全表掃描sql語句的分析SQL
- 【MySQL】全索引掃描的bugMySql索引
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 有索引卻走全表掃描的實驗分析索引
- 使用全表掃描快取大表的相關問題快取
- Oracle的邏輯結構(表空間、段、區間、塊)——Oracle資料塊(二)Oracle
- 解讀Oracle 索引掃描Oracle索引
- Oracle上的邏輯壞塊和物理壞塊Oracle
- 全表掃描的cost 與 索引掃描Cost的比較 – 無直方圖(10.1.0.3以後)索引直方圖
- 深入瞭解ORACLE的邏輯讀Oracle
- oracle sql tuning 8--優化全表掃描OracleSQL優化
- 查詢全表掃描語句