创建表时考虑列的顺序

来源:互联网 发布:php 开发方案 编辑:程序博客网 时间:2024/05/22 22:07
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

创建表时考虑列顺序
创建一个表时表中列的顺序在某些程度上对性能会有一定的影响.(表中的列有数据)
对行数据的存储结构ROWHEADER(行头)和COLUMNDATA(列数据).ROWHEADER存储的信息是一个FLAGBYTE,一个LOCKBYTE和COLUMN

COUNT.COLUMNDATA包含COLUMNLENGTH和COLUMNDATA

关于这些我们可以DUMP个表做一下测试
createtestasselect*fromdba_objects;
selectheader_file,header_blockfromdba_segmentswhereowner='TEST'andsegment_name='TEST';

HEADER_FILE   HEADER_BLOCK
------------------------  ---------------------------
                  13                     1179
altersystemdumpdatafile13block1180

得出来的文件在UDUMP中.我们查看如下信息
block_row_dump:
tab0,row0,@0x1f20
tl:96fb:--H-FL--lb:0x0 cc:13--------rowheader信息.
col 0:[3] 535953-------------------COLUMNDATA
fb:--H-FL--是FLAGBYTE. 
fbFlagByte:
K=ClusterKey(FlagsmaychangemeaningifthisissettoshowHASHcluster)
C=Clustertablemember
H=Headpieceofrow
D=Deletedrow
F=Firstdatapiece
L=Lastdatapiece
P=Firstcolumncontinuesfrompreviouspiece
N=Lastcolumncontinuesinnextpiece
lb:0x0-----------LOCKBYTE,锁信息
cc:13------------COLUMNCOUNT
col 0---------第一列
[3]-------------COLUMNLENGTH
 535953---------实际数据

这里一些信息可以参考grassbell写的文章<<偷窥Datablock的物理结构>>.对每一个列,在每一个列数据前都含有列长度.在做查询时,查询行中某个

列的值,Oracle首先做的是检查这些相关列的长度位.这个操作比较快而且效率较高.但是如果反复频繁的这样子做还是会带来性能方面的影响.
下面的例子中创建了一个有10列的表并插入数据.
先设置DB_BLOCK_SIZE=2K(用参数设置,在这里设置为这个只是为了测试方便)
SQL>createtablesmall(
 2   n0number,
 3   n1number,
 4   n2number,
 5   n3number,
 6   n4number,
 7   n5number,
 8   n6number,
 9   n7number,
 10   n8number,
 11   n9number
 12 )pctfree0;

Tablecreated.

SQL>begin
 2   foriin1..78loop
 3     insertintosmallvalues(0,0,0,0,0,0,0,0,0,0);
 4   endloop;
 5 end;
 6 /

PL/SQLproceduresuccessfullycompleted.

SQL>settimingon
SQL>declare
 2   nnumber;
 3 begin
 4   foriin1..1000000loop
 5     selectsum(n0)intonfromsmall;
 6   endloop;
 7 end;
 8 /

PL/SQLproceduresuccessfullycompleted.

Elapsed:00:07:437.30
SQL>declare
 2   nnumber;
 3 begin
 4   foriin1..1000000loop1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击