在做表结构设计的时候,我们往往不会去考虑字段的摆放顺序。但是,实际上字段的摆放顺序对数据库操作的性能是有影响的。
越靠后的字段效率越低:比如4AAAA6BBBBBB2CC,当要扫描到2CC时,数据库并不知道C的位置,如果头占了10个长度,那么C的位移就是 10+(4+1)+(6+1)+1=23.每个字段没有直接的位移地址的,既然没有23的位移,ORACLE只有通过前面的头,以及A B的位置来推算C的位移。那么越往后面的字段,推算位移次数越多,CPU计算的次数也越多。
越靠后的字段操作开销越大:刚刚说了越往后面的字段,推算位移次数越多,CPU计算的次数也越多,这就意味着CPU的开销就越大。
第一步,创建一个有250个字段的表
set serveroutput on
set echo on
declare
v_sql varchar2(32767);
begin
v_sql:='create table t(';
for i in 1..250
loop
v_sql:=v_sql||'n'||i||' number,';
end loop;
v_sql:=v_sql||'r_pad varchar2(1000))';
execute immediate v_sql;
end;
/
第二步,往这个表中插入10000行数据
declare v_sql varchar2(4000); begin v_sql:='insert into t select '; for i in 1..250 loop v_sql:=v_sql||'0,'; end loop; v_sql:=v_sql||' null from dual connect by level <=10000'; execute immediate v_sql; commit; end; /
第三步,收集统计信息
exec dbms_stats.gather_table_stats(user,'t');
第四步,执行SQL,查出COUNT每个字段的耗时
set serveroutput on size 1000000
declare
v_dummy PLS_INTEGER;
v_start PLS_INTEGER;
v_stop PLS_INTEGER;
v_sql VARCHAR2(100);
BEGIN
v_start :=dbms_utility.get_time;
for j in 1..20
loop
execute immediate 'select count(*) from t ' into v_dummy;
end loop;
v_stop:= dbms_utility.get_time;
dbms_output.put_line('COUNT* 20次的时间是:'|| to_char((v_stop-v_start)*10,'999')||'毫秒');
for i in 1..250
loop
v_sql :='select count(n'||i||') from t';
v_start :=dbms_utility.get_time;
for j in 1..20
loop
execute immediate v_sql into v_dummy;
end loop;
v_stop:=dbms_utility.get_time;
dbms_output.put_line('count'||i||'列20次的时间是:'||to_char((v_stop-v_start)*10,'999')||'毫秒');
end loop;
end;
/
以下是输出的列数据统计20次的耗时,这下一目了然了,印象深刻了,常用的字段要往前摆了。COUNT(*)不需要考虑字段的顺序与位置,所以效率当然是最快的。
COUNT* 20次的时间是: 30毫秒 count1列20次的时间是: 30毫秒 count2列20次的时间是: 30毫秒 count3列20次的时间是: 30毫秒 count4列20次的时间是: 30毫秒 count5列20次的时间是: 20毫秒 count6列20次的时间是: 30毫秒 count7列20次的时间是: 20毫秒 count8列20次的时间是: 20毫秒 count9列20次的时间是: 20毫秒 count10列20次的时间是: 30毫秒 count11列20次的时间是: 20毫秒 count12列20次的时间是: 30毫秒 count13列20次的时间是: 20毫秒 count14列20次的时间是: 30毫秒 count15列20次的时间是: 20毫秒 count16列20次的时间是: 30毫秒 count17列20次的时间是: 30毫秒 count18列20次的时间是: 20毫秒 count19列20次的时间是: 30毫秒 count20列20次的时间是: 30毫秒 count21列20次的时间是: 30毫秒 count22列20次的时间是: 30毫秒 count23列20次的时间是: 30毫秒 count24列20次的时间是: 30毫秒 count25列20次的时间是: 30毫秒 count26列20次的时间是: 40毫秒 count27列20次的时间是: 30毫秒 count28列20次的时间是: 30毫秒 count29列20次的时间是: 30毫秒 count30列20次的时间是: 40毫秒 count31列20次的时间是: 30毫秒 count32列20次的时间是: 40毫秒 count33列20次的时间是: 30毫秒 count34列20次的时间是: 40毫秒 count35列20次的时间是: 40毫秒 count36列20次的时间是: 30毫秒 count37列20次的时间是: 40毫秒 count38列20次的时间是: 40毫秒 count39列20次的时间是: 40毫秒 count40列20次的时间是: 40毫秒 count41列20次的时间是: 40毫秒 count42列20次的时间是: 40毫秒 count43列20次的时间是: 40毫秒 count44列20次的时间是: 40毫秒 count45列20次的时间是: 40毫秒 count46列20次的时间是: 50毫秒 count47列20次的时间是: 40毫秒 count48列20次的时间是: 50毫秒 count49列20次的时间是: 40毫秒 count50列20次的时间是: 40毫秒 count51列20次的时间是: 50毫秒 count52列20次的时间是: 50毫秒 count53列20次的时间是: 40毫秒 count54列20次的时间是: 50毫秒 count55列20次的时间是: 50毫秒 count56列20次的时间是: 40毫秒 count57列20次的时间是: 50毫秒 count58列20次的时间是: 50毫秒 count59列20次的时间是: 50毫秒 count60列20次的时间是: 50毫秒 count61列20次的时间是: 50毫秒 count62列20次的时间是: 50毫秒 count63列20次的时间是: 50毫秒 count64列20次的时间是: 60毫秒 count65列20次的时间是: 50毫秒 count66列20次的时间是: 50毫秒 count67列20次的时间是: 60毫秒 count68列20次的时间是: 60毫秒 count69列20次的时间是: 50毫秒 count70列20次的时间是: 60毫秒 count71列20次的时间是: 60毫秒 count72列20次的时间是: 60毫秒 count73列20次的时间是: 60毫秒 count74列20次的时间是: 50毫秒 count75列20次的时间是: 60毫秒 count76列20次的时间是: 70毫秒 count77列20次的时间是: 60毫秒 count78列20次的时间是: 60毫秒 count79列20次的时间是: 60毫秒 count80列20次的时间是: 60毫秒 count81列20次的时间是: 70毫秒 count82列20次的时间是: 60毫秒 count83列20次的时间是: 70毫秒 count84列20次的时间是: 60毫秒 count85列20次的时间是: 70毫秒 count86列20次的时间是: 60毫秒 count87列20次的时间是: 70毫秒 count88列20次的时间是: 70毫秒 count89列20次的时间是: 60毫秒 count90列20次的时间是: 70毫秒 count91列20次的时间是: 70毫秒 count92列20次的时间是: 70毫秒 count93列20次的时间是: 70毫秒 count94列20次的时间是: 70毫秒 count95列20次的时间是: 70毫秒 count96列20次的时间是: 70毫秒 count97列20次的时间是: 80毫秒 count98列20次的时间是: 70毫秒 count99列20次的时间是: 70毫秒 count100列20次的时间是: 70毫秒 count101列20次的时间是: 80毫秒 count102列20次的时间是: 70毫秒 count103列20次的时间是: 80毫秒 count104列20次的时间是: 80毫秒 count105列20次的时间是: 70毫秒 count106列20次的时间是: 80毫秒 count107列20次的时间是: 80毫秒 count108列20次的时间是: 70毫秒 count109列20次的时间是: 80毫秒 count110列20次的时间是: 80毫秒 count111列20次的时间是: 80毫秒 count112列20次的时间是: 80毫秒 count113列20次的时间是: 80毫秒 count114列20次的时间是: 80毫秒 count115列20次的时间是: 80毫秒 count116列20次的时间是: 80毫秒 count117列20次的时间是: 90毫秒 count118列20次的时间是: 80毫秒 count119列20次的时间是: 80毫秒 count120列20次的时间是: 80毫秒 count121列20次的时间是: 90毫秒 count122列20次的时间是: 80毫秒 count123列20次的时间是: 90毫秒 count124列20次的时间是: 80毫秒 count125列20次的时间是: 90毫秒 count126列20次的时间是: 90毫秒 count127列20次的时间是: 90毫秒 count128列20次的时间是: 80毫秒 count129列20次的时间是: 90毫秒 count130列20次的时间是: 90毫秒 count131列20次的时间是: 90毫秒 count132列20次的时间是: 90毫秒 count133列20次的时间是: 90毫秒 count134列20次的时间是: 90毫秒 count135列20次的时间是: 90毫秒 count136列20次的时间是: 100毫秒 count137列20次的时间是: 90毫秒 count138列20次的时间是: 90毫秒 count139列20次的时间是: 100毫秒 count140列20次的时间是: 90毫秒 count141列20次的时间是: 100毫秒 count142列20次的时间是: 90毫秒 count143列20次的时间是: 100毫秒 count144列20次的时间是: 100毫秒 count145列20次的时间是: 90毫秒 count146列20次的时间是: 100毫秒 count147列20次的时间是: 100毫秒 count148列20次的时间是: 100毫秒 count149列20次的时间是: 120毫秒 count150列20次的时间是: 110毫秒 count151列20次的时间是: 100毫秒 count152列20次的时间是: 100毫秒 count153列20次的时间是: 100毫秒 count154列20次的时间是: 100毫秒 count155列20次的时间是: 110毫秒 count156列20次的时间是: 100毫秒 count157列20次的时间是: 110毫秒 count158列20次的时间是: 100毫秒 count159列20次的时间是: 110毫秒 count160列20次的时间是: 110毫秒 count161列20次的时间是: 100毫秒 count162列20次的时间是: 110毫秒 count163列20次的时间是: 110毫秒 count164列20次的时间是: 110毫秒 count165列20次的时间是: 110毫秒 count166列20次的时间是: 110毫秒 count167列20次的时间是: 110毫秒 count168列20次的时间是: 110毫秒 count169列20次的时间是: 110毫秒 count170列20次的时间是: 120毫秒 count171列20次的时间是: 110毫秒 count172列20次的时间是: 110毫秒 count173列20次的时间是: 120毫秒 count174列20次的时间是: 110毫秒 count175列20次的时间是: 110毫秒 count176列20次的时间是: 120毫秒 count177列20次的时间是: 120毫秒 count178列20次的时间是: 110毫秒 count179列20次的时间是: 120毫秒 count180列20次的时间是: 120毫秒 count181列20次的时间是: 120毫秒 count182列20次的时间是: 120毫秒 count183列20次的时间是: 120毫秒 count184列20次的时间是: 120毫秒 count185列20次的时间是: 120毫秒 count186列20次的时间是: 120毫秒 count187列20次的时间是: 120毫秒 count188列20次的时间是: 120毫秒 count189列20次的时间是: 130毫秒 count190列20次的时间是: 120毫秒 count191列20次的时间是: 120毫秒 count192列20次的时间是: 130毫秒 count193列20次的时间是: 130毫秒 count194列20次的时间是: 120毫秒 count195列20次的时间是: 130毫秒 count196列20次的时间是: 120毫秒 count197列20次的时间是: 130毫秒 count198列20次的时间是: 130毫秒 count199列20次的时间是: 130毫秒 count200列20次的时间是: 130毫秒 count201列20次的时间是: 130毫秒 count202列20次的时间是: 130毫秒 count203列20次的时间是: 130毫秒 count204列20次的时间是: 130毫秒 count205列20次的时间是: 130毫秒 count206列20次的时间是: 130毫秒 count207列20次的时间是: 140毫秒 count208列20次的时间是: 130毫秒 count209列20次的时间是: 130毫秒 count210列20次的时间是: 140毫秒 count211列20次的时间是: 130毫秒 count212列20次的时间是: 140毫秒 count213列20次的时间是: 130毫秒 count214列20次的时间是: 140毫秒 count215列20次的时间是: 140毫秒 count216列20次的时间是: 140毫秒 count217列20次的时间是: 140毫秒 count218列20次的时间是: 140毫秒 count219列20次的时间是: 140毫秒 count220列20次的时间是: 140毫秒 count221列20次的时间是: 140毫秒 count222列20次的时间是: 140毫秒 count223列20次的时间是: 140毫秒 count224列20次的时间是: 140毫秒 count225列20次的时间是: 140毫秒 count226列20次的时间是: 150毫秒 count227列20次的时间是: 140毫秒 count228列20次的时间是: 140毫秒 count229列20次的时间是: 150毫秒 count230列20次的时间是: 140毫秒 count231列20次的时间是: 150毫秒 count232列20次的时间是: 140毫秒 count233列20次的时间是: 150毫秒 count234列20次的时间是: 150毫秒 count235列20次的时间是: 150毫秒 count236列20次的时间是: 140毫秒 count237列20次的时间是: 150毫秒 count238列20次的时间是: 150毫秒 count239列20次的时间是: 150毫秒 count240列20次的时间是: 150毫秒 count241列20次的时间是: 150毫秒 count242列20次的时间是: 150毫秒 count243列20次的时间是: 150毫秒 count244列20次的时间是: 150毫秒 count245列20次的时间是: 160毫秒 count246列20次的时间是: 150毫秒 count247列20次的时间是: 150毫秒 count248列20次的时间是: 150毫秒 count249列20次的时间是: 160毫秒 count250列20次的时间是: 150毫秒

