10046确认多块读无法跨区
SQL查询记录,记录是如何从磁盘中读取的呢? 有几种访问方式? 本次测试探讨数据文件离散读无法跨区,因此单块读(顺序读)存在特殊场景,一个表的一个块在某个区中,Oracle查询记录及时全表扫描,也会产生单块读现象。 文档结构如下: 1.解释说明oracle数据文件从磁盘读取有几种方式 2.创建测试对象,并进行多块读测试解释说明 3.创建测试环境,一个表已分配多个区,存在一个区只使用一个块,次数对测试表全表扫描,验证是否存在单块读现象。 ? 一、解释说明oracle数据文件从磁盘读取有几种方式 EVENT# EVENT_ID NAME PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS ---------- ---------- ----------------------------------- ------------- ---------- ---------- ---------- 9 2171045634 remote db file read clientid count intr Network 146 2652584166 db file sequential read file# block# blocks User I/O 147 506183215 db file scattered read file# block# blocks User I/O 151 834992820 db file parallel read files blocks requests User I/O 197 3926164927 direct path read file number first dba block cnt User I/O 198 861319509 direct path read temp file number first dba block cnt User I/O 269 3999678875 securefile direct-read completion User I/O 7 rows selected. db file scattered read db file sequential read direct path read
二、多块读测试 ? 1)创建测试数据 SQL> create table scott.e(id char(2000),name char(2000), SQL> select tablespace_name,file_id,extent_id,block_id,bytes/1024 bytes_k,blocks from dba_extents where owner=‘SCOTT‘ and segment_name=‘E‘ TABLESPACE_NAM FILE_ID EXTENT_ID BLOCK_ID BYTES_K BLOCKS -------------- ---------- ---------- ---------- ---------- ---------- USERS 4 0 1768 64 8 USERS 4 1 1776 64 8 USERS 4 2 1784 64 8 4)查询rowid 数据对象编号(6位显示)
5)根据rowid查询块编号 6)数据文件离散读测试 SQL> alter system flush buffer_cache;
Session altered. SQL> select count(*) from scott.e; COUNT(*) SQL> alter session set events ‘10046 trace name context off‘; Session altered. jx1:/u01/app/oracle/diag/rdbms/jx/jx1/trace$ cat jx1_ora_30782.trc |grep scatt 可以发现执行一次全表扫描,数据文件多块读,读取了三次,每次返回不同的块数量
三、创建测试环境,一个表已分配多个区,存在一个区只使用一个块,次数对测试表全表扫描,验证是否存在单块读现象 1)环境构建,使用笨拙的办法,不断insert,查询extent分配 SQL> insert into scott.e values(8,8,8); SQL> insert into scott.e values(9,9,9); SQL> insert into scott.e values(10,10,10); SQL> insert into scott.e values(11,11,11); SQL> insert into scott.e values(12,12,12); SQL> r TABLESPACE_NAM FILE_ID EXTENT_ID BLOCK_ID BYTES_K BLOCKS SQL> select rowid from scott.e where id like ‘%12%‘; ROWID select rowid,dbms_rowid.rowid_row_number(rowid) "row" from scott.e; ROWID objct file block row ------------------ ---------- ---------- ---------- ---------- AAAS5RAAEAAAAbsAAA 77393 4 1772 0 AAAS5RAAEAAAAbvAAA 77393 4 1775 0 AAAS5RAAEAAAAbwAAA 77393 4 1776 0 AAAS5RAAEAAAAbxAAA 77393 4 1777 0 AAAS5RAAEAAAAb0AAA 77393 4 1780 0 AAAS5RAAEAAAAb2AAA 77393 4 1782 0 AAAS5RAAEAAAAb7AAA 77393 4 1787 0 AAAS5RAAEAAAAb9AAA 77393 4 1789 0 AAAS5RAAEAAAAb/AAA 77393 4 1791 0 AAAS5RAAEAAAAb/AAB 77393 4 1791 1 AAAS5RAAEAAAAb/AAC 77393 4 1791 2 AAAS5RAAEAAAAyGAAA 77393 4 3206 0 --- 12 rows selected.
2)10046跟踪 ? SQL> alter system flush buffer_cache; SQL> alter session set events ‘10046 trace name context forever,level 12‘; Session altered. SQL> select count(*) from scott.e; COUNT(*) SQL> alter session set events ‘10046 trace name context off‘; Session altered. jx1:/u01/app/oracle/diag/rdbms/jx/jx1/trace$ cat jx1_ora_55917.trc|grep read 原谅我容易满足,得到单块读现象后,我现在停止了脚步,如有兴趣的朋友,可以继续研究,这些块都是什么对象,为什么这读取,是否存在什么规则。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |