表中列的排列顺序对查询的影响
列顺序测试
大家在做表设计的时候通常对表中列的排列顺序没有过多注意,但是其实越常用的列,它的位置越靠前,则查询速度越快。
因为每个block里面存储了row directory (每行数据在块中的位移地址)而没有存放column的位移
所以只能根据column#通过扫描row header 以及 column data 来获取相应的列值
越靠后的列,需要计算的越多
建立测试表col_test
[sql]
declare
v_sql varchar2(4000) ;
begin
v_sql := 'create table col_test (' ;
for i in 1 .. 100 loop
v_sql := v_sql || 'id'||i||' number ,' ;
end loop ;
v_sql := substr(v_sql,1,length(v_sql)-1) || ') ' ;
execute immediate v_sql ;
end ;
/ www.zzzyk.com
_dexter@DAVID> desc col_test ;
Name Null? Type
----------------------------------------------------- -------- --------------
ID1 NUMBER
ID2 NUMBER
ID3 NUMBER
ID4 NUMBER
ID5 NUMBER
....
ID99 NUMBER
ID100 NUMBER
初始化数据100w条
[sql]
declare
v_sql varchar2(4000) ;
begin
v_sql := 'insert into col_test select ' ;
for i in 1 .. 100 loop
v_sql := v_sql || ' 1 ,' ;
end loop ;
v_sql := substr(v_sql,1,length(v_sql)-1) || ' from dual connect by level <= 1000000 ' ;
execute immediate v_sql ;
commit ;
end ;
/
测试耗时
[sql]
declare
n number ;
begin_t pls_integer ;
end_t pls_integer ;
v_Sql varchar2(4000) ;
begin
for i in 1 .. 101 loop
begin_t := dbms_utility.get_time ;
if i = 1 then
v_sql := 'select count(*) from col_test' ;
else
v_sql := 'select count(id'||(i-1)||') from col_test' ;
end if ;
execute immediate v_sql into n ;
end_t := dbms_utility.get_time ;
dbms_output.put_line('Col'||(i-1)||' : '||(end_t-begin_t)*10);
end loop ;
end ;
/
--下面的单位为毫秒
_dexter@DAVID> /
Col0 : 150
Col1 : 140
Col2 : 110
Col3 : 100
Col4 : 100
Col5 : 110
Col6 : 110
Col7 : 110
Col8 : 110
Col9 : 120
Col10 : 130
Col11 : 120
Col12 : 110
Col13 : 120
Col14 : 120
Col15 : 120
Col16 : 130
Col17 : 120
Col18 : 160
Col19 : 130
Col20 : 140
Col21 : 130
Col22 : 140
Col23 : 140
Col24 : 140
Col25 : 130
Col26 : 160
Col27 : 150
Col28 : 140
Col29 : 150
Col30 : 150
Col31 : 160
Col32 : 180
Col33 : 160
Col34 : 160
Col35 : 160
Col36 : 160
Col37 : 170
Col38 : 180
Col39 : 170
Col40 : 170
Col41 : 180
Col42 : 180
Col43 : 170
Col44 : 210
Col45 : 190
Col46 : 180
Col47 : 180
Col48 : 190
Col49 : 210
Col50 : 190
Col51 : 190
Col52 : 200
Col53 : 200
Col54 : 230
Col55 : 200
Col56 : 210
Col57 : 200
Col58 : 210
Col59 : 220
Col60 : 210
Col61 : 210
Col62 : 220
Col63 : 240
Col64 : 220
Col65 : 220
Col66 : 220
Col67 : 230
Col68 : 270
Col69 : 220
Col70 : 230
Col71 : 230
Col72 : 270
Col73 : 230
Col74 : 240
Col75 : 240
Col76 : 250
Col77 : 240
Col78 : 260
Col79 : 260
Col80 : 280
Col81 : 250
Col82 : 250
Col83 : 250
Col84 : 250
Col85 : 260
Col86 : 260
Col87 : 260
Col88 : 290
Col89 : 260
Col90 : 270
Col91 : 280
Col92 : 280
Col93 : 280
Col94 : 27
补充:综合编程 , 其他综合 ,