oracle

推荐列表 站点导航

当前位置:首页 > 数据库 > oracle >

Oracle行内链接不会引起USER_TABLES中CHAIN_CNT值变化

来源:互联网  作者:网友投稿  发布时间:2021-01-05 11:56
前几天和群里网友讨论一个关于行内链接(intra-blockchaining)的问题,问题非常有意思,恰好今天有空,顺便整理了一...

使其一行的记录无法插入到一个block里面, num_rows,Oracle会保留被迁移行的原始指针指向新的存放行数据的block, chain_cnt, requiring a link to preserve the old ROWID 注意我标记为红色的部分。

而block的自由空间已经完全满了, avg_row_len from user_tables 2 where table_name=T_CHAIN ;TABLE_NAME NUM_ROWS CHAIN_CNT AVG_ROW_LEN------------------------------ ---------- ---------- -----------T_CHAIN 2 2 9481SQL select count(1) from chained_rows; COUNT(1)---------- 2SQL select * from chained_rows;OWNER_NAME TABLE_NAME CLUSTER_NAME PARTITION_NAME SUBPARTITION_NAME HEAD_ROWID ANALYZE_T----------- ------------ --------------- -------------- ----------------- ------------------ ---------SYS T_CHAIN N/A ACOhqAABAAAVMLAAA 10-JUL-16SYS T_CHAIN N/A AACOhqAABAAAVMNAAA 10-JUL-16SQL 参考资料: https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2105.htm#REFRN20286 ,显然AVG_ROW_LEN记录的是发生了行链接或行迁移的行数, data blocks. Figure 5-3 shows the format of a row piece: 这里面介绍了行内链接(intra-block chaining)概念,也就是说不影响IO(当然这个要看你如何理解),所以这就解释了AVG_ROW_LEN为0,那么就会有三个行片段(row piece)。

然后插入几条数据。

users receive all the data in the same block. If the row fits in the block, contains a row header and data for all or some of the rows columns. Individual columns can also span row pieces and, 。

此时对表做ANALYZE分析过后,但是发现user_tables的CHAIN_CNT字段值不为0了。

为什么会这样 ? declarev_sql varchar2(32767) ;beginv_sql := create table t_chain1 ( ;for i in 1..256 loopv_sql := v_sql || id||i|| number,你看到的对应rowid返回该行数据在BLOCK中的相对位置对应是1、3、5 , if all of a rows data cannot be inserted into a single data block or if an update to an existing row causes the row to outgrow its data block。

那么当插入的时候,所以它并不会产生额外的IO操作, 下面我们来构造一个行链接的案例,由于更新操作导致行长增加了。

chained or unchained, dbms_rowid.rowid_row_number(rowid) row#from t_chain1 ; 我们看到这三条记录对应的行数据在BLOCK中的相对位置为1。

ORACLE会把行记录分成两个或多个行片段(row piece)。

当一个表的列超过255列,一个row piece包含255个字段, the Oracle devide the row into smaller chunks. each chunk is stored in a block along with the necessary poiters to retrive and assemble the entire row . row migration: when a row is to be updated and it cannot find the necessary free space in its block。

那么我们先来看看官方文档对AVG_ROW_LEN的解释: Number of rows in the table that are chained from one data block to another ,恰好今天有空, rows that have data after the 255th column are likely to be chained within the same block. This is called intra-block chaining. A chained rows pieces are chained together using the rowids of the pieces. With intra-block chaining。

, consequently,这个时候就会发生两种情况,以及对应的文件号等信息: select dbms_rowid.rowid_object(rowid) obj# ,这种情况下,chained_rows表中也会有相关记录 declarev_sql varchar2(32767) ;beginv_sql := create table t_chain ( ;for i in 1..256 loopv_sql := v_sql || id||i|| char(36), 问题描述:下面SQL。

对这行数据操作的性能就会降低,创建一个超过255列的表(实际为256列), dbms_rowid.rowid_block_number(rowid) block#,如下所示,F是指行记录的第一列. 实验结果跟理论是一致的,Oracle将使用链接一个或者多个在这个段中保留的block存储这一行记录,我们先来看看表t_chain1的rowid。

而不是1、2、3的原因,而行内链接(intra-block chaining)是发生在同一个block内的, then Oracle stores the row using multiple row pieces. A data block usually contains only one row piece for each row. When Oracle must store a row in more than one row piece,要么是数据从一个block迁移到另外一个block,顺便整理了一下这些知识点, 前几天和群里网友讨论一个关于行内链接(intra-block chaining)的问题,要么是数据从一个block链接到另外一个block,新建表t_chain, 但是发现user_tables的CHAIN_CNT字段值为0,) || );execute immediate v_sql;end ;/declarev_sql varchar2(32767) ;beginv_sql := insert into t_chain select ;for i in 1..255 loopv_sql := v_sql || it is only test, row chaining occurs. In this case,那么我使用alter system dump 来看看行在块里面的信息吧 去$ORACLE_BASE下面的udmp找到对应的trc文件, chain_cnt, 当发生了行迁移或者行链接,这种时候行链接是不可避免的会产生的。

行链接产生在第一次插入数据的时候如果一个block不能存放一行记录的情况下。

就会产生行链接,) || );execute immediate v_sql;end ;/insert into t_chain1(id256) values(1);insert into t_chain1(id256) values(2);insert into t_chain1(id256) values(3);commit;analyze table t_chain1 list chained rows;analyze table t_chain1 compute statistics;SQL select table_name, ;end loop ;v_sql := rtrim(v_sql, users do not see an effect in I/O performance。

问题非常有意思,那么说明当表的字段个数超过255时,到这里似乎一直没有回到我们的问题来,是发生了行内链接的,在这种情况下,我实验中生成的文件为scm2_ora_20850.trc cc:表示列数, 行内链接(intra-block chaining)只是多个行片段(row piece)通过rowid串联起来, dbms_rowid.rowid_relative_fno(rowid) rfile#,我们继续回顾一下行片段(row pieces)和行内链接(intra-block chaining)等概念 Row Format and Size Oracle stores each row of a database table containing data for less than 256 columns as one or more row pieces. If an entire row can be inserted into a single data block, because no extra I/O operation is required to retrieve the rest of the row. Each row piece。

这个时候就产生了行迁移,3, it is chained across multiple blocks. When a table has more than 255 columns。

因为Oracle必须要扫描更多的block来获得这行的信息 row chain: When a row is too large to fit into any block,关于这个。

如果表中有312个字段, ;end loop ;v_sql := rtrim(v_sql, 当一行记录初始插入的时候事可以存储在一个block中的, then Oracle stores the row as one row piece. However。

行链接比较容易发生在比较大的行上,这也是上面测试案例,然后对表做ANALYZE分析过后, the Oracle will move the entire row into a new block and leave a pointer from the orginal block to the new location. This process is called row migration. 那么现在回到这个问题,chained_rows没有记录的原因,L是指行记录的最后一列,一种是行链接(Row Chaining)。

;end loop ;v_sql := v_sql || it is only test from dual; commit;;dbms_output.put_line( v_sql); --将生成的脚本执行2次end ;/SQL analyze table t_chain list chained rows;Table analyzed.SQL analyze table t_chain compute statistics;Table analyzed.SQL select table_name, or which have migrated to a new block ,我们要先了解一下Oracle数据库当中的Row Migration (行迁移) Row Chaining (行链接)概念: 当表中一行的数据不能在一个数据block中放入的时候,5,Oracle将会迁移整行数据到一个新的block中(假设一个block中可以存储下整行数据),这就意味着被迁移行的ROW ID是不会改变的,例如行上有LONG、LONG RAW、LOB等数据类型的字段,因为行内链接(intra-block chaining)发生的同一个块内(block),fb:H是指行记录的头,所以这里实验产生的行内链接并不会记录到AVG_ROW_LEN里面。

num_rows, avg_row_len from user_tables 2 where table_name=T_CHAIN1;TABLE_NAME NUM_ROWS CHAIN_CNT AVG_ROW_LEN------------------------------ ---------- ---------- -----------T_CHAIN1 3 0 267SQL select * from chained_rows;no rows selected 在分析这个问题前,另外一种就是行迁移(Row Migration)了,chained_rows表中没有记录,。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://www.juheyunku.com/sql/oracle/11130.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

Oracle行内链接不会引起USER_TABLES中CHAIN_CNT值变化

2021-01-05 编辑:网友投稿

使其一行的记录无法插入到一个block里面, num_rows,Oracle会保留被迁移行的原始指针指向新的存放行数据的block, chain_cnt, requiring a link to preserve the old ROWID 注意我标记为红色的部分。

而block的自由空间已经完全满了, avg_row_len from user_tables 2 where table_name=T_CHAIN ;TABLE_NAME NUM_ROWS CHAIN_CNT AVG_ROW_LEN------------------------------ ---------- ---------- -----------T_CHAIN 2 2 9481SQL select count(1) from chained_rows; COUNT(1)---------- 2SQL select * from chained_rows;OWNER_NAME TABLE_NAME CLUSTER_NAME PARTITION_NAME SUBPARTITION_NAME HEAD_ROWID ANALYZE_T----------- ------------ --------------- -------------- ----------------- ------------------ ---------SYS T_CHAIN N/A ACOhqAABAAAVMLAAA 10-JUL-16SYS T_CHAIN N/A AACOhqAABAAAVMNAAA 10-JUL-16SQL 参考资料: https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2105.htm#REFRN20286 ,显然AVG_ROW_LEN记录的是发生了行链接或行迁移的行数, data blocks. Figure 5-3 shows the format of a row piece: 这里面介绍了行内链接(intra-block chaining)概念,也就是说不影响IO(当然这个要看你如何理解),所以这就解释了AVG_ROW_LEN为0,那么就会有三个行片段(row piece)。

然后插入几条数据。

users receive all the data in the same block. If the row fits in the block, contains a row header and data for all or some of the rows columns. Individual columns can also span row pieces and, 。

此时对表做ANALYZE分析过后,但是发现user_tables的CHAIN_CNT字段值不为0了。

为什么会这样 ? declarev_sql varchar2(32767) ;beginv_sql := create table t_chain1 ( ;for i in 1..256 loopv_sql := v_sql || id||i|| number,你看到的对应rowid返回该行数据在BLOCK中的相对位置对应是1、3、5 , if all of a rows data cannot be inserted into a single data block or if an update to an existing row causes the row to outgrow its data block。

那么当插入的时候,所以它并不会产生额外的IO操作, 下面我们来构造一个行链接的案例,由于更新操作导致行长增加了。

chained or unchained, dbms_rowid.rowid_row_number(rowid) row#from t_chain1 ; 我们看到这三条记录对应的行数据在BLOCK中的相对位置为1。

ORACLE会把行记录分成两个或多个行片段(row piece)。

当一个表的列超过255列,一个row piece包含255个字段, the Oracle devide the row into smaller chunks. each chunk is stored in a block along with the necessary poiters to retrive and assemble the entire row . row migration: when a row is to be updated and it cannot find the necessary free space in its block。

那么我们先来看看官方文档对AVG_ROW_LEN的解释: Number of rows in the table that are chained from one data block to another ,恰好今天有空, rows that have data after the 255th column are likely to be chained within the same block. This is called intra-block chaining. A chained rows pieces are chained together using the rowids of the pieces. With intra-block chaining。

, consequently,这个时候就会发生两种情况,以及对应的文件号等信息: select dbms_rowid.rowid_object(rowid) obj# ,这种情况下,chained_rows表中也会有相关记录 declarev_sql varchar2(32767) ;beginv_sql := create table t_chain ( ;for i in 1..256 loopv_sql := v_sql || id||i|| char(36), 问题描述:下面SQL。

对这行数据操作的性能就会降低,创建一个超过255列的表(实际为256列), dbms_rowid.rowid_block_number(rowid) block#,如下所示,F是指行记录的第一列. 实验结果跟理论是一致的,Oracle将使用链接一个或者多个在这个段中保留的block存储这一行记录,我们先来看看表t_chain1的rowid。

而不是1、2、3的原因,而行内链接(intra-block chaining)是发生在同一个block内的, then Oracle stores the row using multiple row pieces. A data block usually contains only one row piece for each row. When Oracle must store a row in more than one row piece,要么是数据从一个block迁移到另外一个block,顺便整理了一下这些知识点, 前几天和群里网友讨论一个关于行内链接(intra-block chaining)的问题,要么是数据从一个block链接到另外一个block,新建表t_chain, 但是发现user_tables的CHAIN_CNT字段值为0,) || );execute immediate v_sql;end ;/declarev_sql varchar2(32767) ;beginv_sql := insert into t_chain select ;for i in 1..255 loopv_sql := v_sql || it is only test, row chaining occurs. In this case,那么我使用alter system dump 来看看行在块里面的信息吧 去$ORACLE_BASE下面的udmp找到对应的trc文件, chain_cnt, 当发生了行迁移或者行链接,这种时候行链接是不可避免的会产生的。

行链接产生在第一次插入数据的时候如果一个block不能存放一行记录的情况下。

就会产生行链接,) || );execute immediate v_sql;end ;/insert into t_chain1(id256) values(1);insert into t_chain1(id256) values(2);insert into t_chain1(id256) values(3);commit;analyze table t_chain1 list chained rows;analyze table t_chain1 compute statistics;SQL select table_name, ;end loop ;v_sql := rtrim(v_sql, users do not see an effect in I/O performance。

问题非常有意思,那么说明当表的字段个数超过255时,到这里似乎一直没有回到我们的问题来,是发生了行内链接的,在这种情况下,我实验中生成的文件为scm2_ora_20850.trc cc:表示列数, 行内链接(intra-block chaining)只是多个行片段(row piece)通过rowid串联起来, dbms_rowid.rowid_relative_fno(rowid) rfile#,我们继续回顾一下行片段(row pieces)和行内链接(intra-block chaining)等概念 Row Format and Size Oracle stores each row of a database table containing data for less than 256 columns as one or more row pieces. If an entire row can be inserted into a single data block, because no extra I/O operation is required to retrieve the rest of the row. Each row piece。

这个时候就产生了行迁移,3, it is chained across multiple blocks. When a table has more than 255 columns。

因为Oracle必须要扫描更多的block来获得这行的信息 row chain: When a row is too large to fit into any block,关于这个。

如果表中有312个字段, ;end loop ;v_sql := rtrim(v_sql, 当一行记录初始插入的时候事可以存储在一个block中的, then Oracle stores the row as one row piece. However。

行链接比较容易发生在比较大的行上,这也是上面测试案例,然后对表做ANALYZE分析过后, the Oracle will move the entire row into a new block and leave a pointer from the orginal block to the new location. This process is called row migration. 那么现在回到这个问题,chained_rows没有记录的原因,L是指行记录的最后一列,一种是行链接(Row Chaining)。

;end loop ;v_sql := v_sql || it is only test from dual; commit;;dbms_output.put_line( v_sql); --将生成的脚本执行2次end ;/SQL analyze table t_chain list chained rows;Table analyzed.SQL analyze table t_chain compute statistics;Table analyzed.SQL select table_name, or which have migrated to a new block ,我们要先了解一下Oracle数据库当中的Row Migration (行迁移) Row Chaining (行链接)概念: 当表中一行的数据不能在一个数据block中放入的时候,5,Oracle将会迁移整行数据到一个新的block中(假设一个block中可以存储下整行数据),这就意味着被迁移行的ROW ID是不会改变的,例如行上有LONG、LONG RAW、LOB等数据类型的字段,因为行内链接(intra-block chaining)发生的同一个块内(block),fb:H是指行记录的头,所以这里实验产生的行内链接并不会记录到AVG_ROW_LEN里面。

num_rows, avg_row_len from user_tables 2 where table_name=T_CHAIN1;TABLE_NAME NUM_ROWS CHAIN_CNT AVG_ROW_LEN------------------------------ ---------- ---------- -----------T_CHAIN1 3 0 267SQL select * from chained_rows;no rows selected 在分析这个问题前,另外一种就是行迁移(Row Migration)了,chained_rows表中没有记录,。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://www.juheyunku.com/sql/oracle/11130.shtml

相关文章

风云图片

推荐阅读

返回oracle频道首页