最佳字段顺序(结论:越往后的列访问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(*)最快。
——后面还有看图说话,看看结果输出的趋势图,就更了然了。
验证脚本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(*)最快。
——后面还有看图说话,看看结果输出的趋势图,就更了然了。