当前位置:编程学习 > 网站相关 >>

表中列的排列顺序对查询的影响

列顺序测试
大家在做表设计的时候通常对表中列的排列顺序没有过多注意,但是其实越常用的列,它的位置越靠前,则查询速度越快。
因为每个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

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,