计算列存放的位置,越往后开销的cpu越大

  最佳字段顺序(结论:越往后的列访问CPU开销大)
  
  
  验证脚本1(先构造出表和数据)
  设置SERVEROUTPUT
  设置回声
  - - -构造出有25个字段的表T
  删除表t;
  声明
  ,l_sql VARCHAR2 (32767)。
  开始
  ,l_sql:='创建表t (';
  ,因为我在1 . . 25,
  ,循环
  ,,l_sql:=l_sql | | ' n ' | |我| |数字,,
  ,结束循环;
  ,l_sql:=l_sql | |“垫VARCHAR2 (1000)) PCTFREE 10”;
  ,执行直接l_sql;
  结束;
/
  - - - - -将记录还有这个表T中填充
  声明
  ,l_sql VARCHAR2 (32767)。
  开始
  ,l_sql:='插入t选择“;
  ,因为我在1 . .25
  ,循环
  ,,l_sql:=l_sql | | 0,,
  ,结束循环;
  ,l_sql:=l_sql | |“零从双重连接水平& lt;=10000”;
  ,执行直接l_sql;
  ,提交;
  结束;
/
  
  
  
  
  ——验证脚本2(一次访问该表各字段验证),
  执行dbms_stats.gather_table_stats (ownname=祝辞;用户,tabname=在“t”)
  选择num_rows,块从user_tables table_name=' T ';
  ——以下动作观察执行速度,比较发现COUNT(*)最快,计数(最大列)最慢
  声明
  ,l_dummy PLS_INTEGER;
  ,l_start PLS_INTEGER;
  ,l_stop PLS_INTEGER;
  ,l_sql VARCHAR2 (100)。
  开始
  ,l_start:=dbms_utility.get_time;
  ,j在1 . .1000年
  ,循环
  ,,立即执行SELECT count(*)从t的l_dummy;
  ,结束循环;
  ,l_stop:=dbms_utility.get_time;
  ,dbms_output.put_line ((l_stop-l_start)/100);
  
  
  ,因为我在1 . .25
  ,循环
  ,,l_sql:=' SELECT count (n ' | |我| |”)从t的;
  ,,l_start:=dbms_utility.get_time;
  ,,j在1 . .1000年
  ,,循环
  ,,,执行直接l_sql l_dummy;
  ,,结束循环;
  ,,l_stop:=dbms_utility.get_time;
  ,,dbms_output.put_line ((l_stop-l_start)/100);
  ,结束循环;
  结束;
/
  ——结论:
  ——原来优化器是这么搞的:列的偏移量决定性能,列越靠后,访问的开销越大。由于count(*)的算法与列偏移量无关,所以count(*)最快。
  ——后面还有看图说话,看看结果输出的趋势图,就更了然了。
  

计算列存放的位置,越往后开销的cpu越大