創(chuàng )建一個(gè)表時(shí)表中列的順序對性能有什么影響?
??創(chuàng )建一個(gè)表時(shí)表中列的順序在某些程度上對性能會(huì )有一定的影響。(表中的列有數據) 。
Oracle對行數據的存儲結構ROW HEADER(行頭)和COLUMN DATA(列數據)。ROW HEADER存儲的信息是一個(gè)FLAG BYTE,一個(gè)LOCK BYTE 和COLUMN,COUNT。
??COLUMN DATA包含COLUMN LENGTH和COLUMN DATA。
關(guān)于這些我們可以DUMP個(gè)表做一下測試: create test as select * from dba_objects;select header_file,header_block from dba_segments where owner='TEST' and segment_name='TEST';HEADER_FILEHEADER_BLOCK------------------------
---------------------------
13 1179alter system dump datafile 13 block 1180
得出來(lái)的文件在UDUMP中。
??
我們查看如下信息:
block_row_dump:tab 0, row 0, @0x1f20tl: 96 fb: --H-FL-- lb: 0x0 cc: 13--------row header信息。col 0: [ 3] 53 59 53-------------------COLUMN DATAfb: --H-FL-- 是FLAG BYTE。
??fb Flag Byte:K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)C = Cluster table memberH = Head piece of rowD = Deleted rowF = First data pieceL = Last data pieceP = First column continues from previous pieceN = Last column continues in next piecelb: 0x0-----------LOCK BYTE,鎖信息cc: 13------------COLUMN COUNTcol 0---------第一列[ 3]-------------COLUMN LENGTH 53 59 53---------實(shí)際數據
列的值,Oracle首先做的是檢查這些相關(guān)列的長(cháng)度位。
??這個(gè)操作比較快而且效率較高。但是如果反復頻繁的這樣子做還是會(huì )帶來(lái)性能方面的影響。
下面的例子中創(chuàng )建了一個(gè)有10列的表并插入數據。
先設置DB_BLOCK_SIZE=2K(用參數設置,在這里設置為這個(gè)只是為了測試方便):
SQL> create table small ( 2n0 number, 3n1 number, 4n2 number, 5n3 number, 6n4 number, 7n5 number, 8n6 number, 9n7 number, 10n8 number, 11n9 number 12 ) pctfree 0;Table created。
??SQL> begin 2for i in 1。。78 loop 3 insert into small values (0,0,0,0,0,0,0,0,0,0); 4end loop; 5 end; 6 /PL/SQL procedure successfully completed。
??SQL> set timing onSQL> declare 2n number; 3 begin 4for i in 1。。1000000 loop 5 select sum(n0) into n from small; 6end loop; 7 end; 8 /PL/SQL procedure successfully completed。
??Elapsed: 00:07:437。30SQL> declare 2n number; 3 begin 4for i in 1。。1000000 loop 5 select sum(n9) into n from small; 6end loop; 7 end; 8 /PL/SQL procedure successfully completed。
??Elapsed: 00:08:482。13。