网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.轻松掌握使用SQL Server 浏览器.
.sql server 2000数据库置疑的解决.
.教你轻松解决数据库非事务表回滚.
.存储过程中如何使用事务.
.SQL Server 2000中生成XML的小技.
.对跨多个表格的数据组合时需要用.
.SQL SERVER 2000 安装(症状归纳.
.教你轻松掌握一个纵表转横表的"S.
.Win2003系统安装SQL Sever2000后.
.SQL Server开发过程中的的常见问.
.SQL数据库用户只有“名称”而无“.
.SQL2005生成SQL2000脚本的一些解.
.选择是否恢复整个SQL Server的方.
.深入探讨数据仓库缓慢变化维的解.
.修改SQL Server 2005 sa用户密码.
.SQL Server 某些条件下求某日的日.
.SELECT查询的应用(二).
.删除数据库中重复数据的几个方法.
.SQL Server 中易混淆的数据类型.
.教你在不同数据库环境下读取前N条.

创建一个表时表中列的顺序对性能的影响

发表日期:2008-3-28


创建一个表时表中列的顺序在某些程度上对性能会有一定的影响。(表中的列有数据) 。

Oracle对行数据的存储结构ROW HEADER(行头)和COLUMN DATA(列数据)。ROW HEADER存储的信息是一个FLAG BYTE,一个LOCK BYTE 和COLUMN,COUNT.COLUMN DATA包含COLUMN LENGTH和COLUMN DATA。

关于这些我们可以DUMP个表做一下测试:

create test as select * from dba_objects;
select header_file,header_block from 
dba_segments where owner='TEST' and segment_name='TEST';

HEADER_FILEHEADER_BLOCK
------------------------  ---------------------------
  13 1179
alter system dump datafile 13 block 1180

得出来的文件在UDUMP中。

我们查看如下信息:

block_row_dump:
tab 0, row 0, @0x1f20
tl: 96 fb: --H-FL-- lb: 0x0 cc: 13--------row header信息.
col 0: [ 3] 53 59 53-------------------COLUMN DATA
fb: --H-FL-- 是FLAG BYTE.
fb Flag Byte:
K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
C = Cluster table member
H = Head piece of row
D = Deleted row
F = First data piece
L = Last data piece
P = First column continues from previous piece
N = Last column continues in next piece
lb: 0x0-----------LOCK BYTE,锁信息
cc: 13------------COLUMN COUNT
col 0---------第一列
[ 3]-------------COLUMN LENGTH
 53 59 53---------实际数据

列的值,Oracle首先做的是检查这些相关列的长度位.这个操作比较快而且效率较高。但是如果反复频繁的这样子做还是会带来性能方面的影响。

下面的例子中创建了一个有10列的表并插入数据。

先设置DB_BLOCK_SIZE=2K(用参数设置,在这里设置为这个只是为了测试方便):

SQL> create table small (
 2n0 number,
 3n1 number,
 4n2 number,
 5n3 number,
 6n4 number,
 7n5 number,
 8n6 number,
 9n7 number,
 10n8 number,
 11n9 number
 12 ) pctfree 0;

Table created.

SQL> begin
 2for i in 1..78 loop
 3 insert into small values (0,0,0,0,0,0,0,0,0,0);
 4end loop;
 5 end;
 6 /

PL/SQL procedure successfully completed.

SQL> set timing on
SQL> declare
 2n number;
 3 begin
 4for i in 1..1000000 loop
 5 select sum(n0) into n from small;
 6end loop;
 7 end;
 8 /

PL/SQL procedure successfully completed.

Elapsed: 00:07:437.30
SQL> declare
 2n number;
 3 begin
 4for i in 1..1000000 loop
 5 select sum(n9) into n from small;
 6end loop;
 7 end;
 8 /

PL/SQL procedure successfully completed.

Elapsed: 00:08:482.13

从上面的例子很明显可以看到在一个表中做查询时,查询的数据和列的属性都是一样的,但是所查的列位于第一列时查询速度比在第10快了差不多10%。所以在建表的时候规则就是根据应用将表中经常访问的列放面前面。建表时一般都有一个PRIMARY KEY的列,像这种属性的列一般我们直接访问的并不多。所以我们一般不放在第一列.关于这个其实如果我们有注意到的话,Oracle本身字典内表也是这样子,desc dba_objects看看或者其他的表可以试试。还有另外一个要考虑的列的位置的就是列中含有较多的NULL值时所要放的位置。

Oracle存储NULL值时,一行中某个列存在NULL值,而这一列的后面的列中存在有数据(非NULL),则Oracle会分配1byte来存放NULL。如果这一列的后面没有列或者都是NULL值时。这一列和后面的NULL值Oracle都不做存储.列信息也不存储。这一点可以看以下例子:

SQL> create table null_order (
 2column1 number,
 3column2 number,
 4column3 number
 5 );

Table created.

SQL> insert into null_order (column2) values (0);

1 row created.

SQL> select header_file, header_block from dba_segments
 2 where segment_name = 'TEST' and owner = 'TEST';

HEADER_FILE HEADER_BLOCK
----------- ------------
 350010

SQL> alter system dump datafile 3 block 50011;

System altered.

然后查看DUMP出来的文件的相关信息:

block_row_dump:
tab 0, row 0, @0x7b2
tl: 6 fb: --H-FL-- lb: 0x1 cc: 2
col 0: *NULL*--------------第一列的NULL
col 1: [ 1] 80----------------第二列的值(后面没有了第三列的值)
end_of_block_dump

结论:

创建一个表时,可以将我们经常访问到的列放在表的前面。一般很少直接SELECT出来的PRIMARY KEY列可以放到中间来。列中如果可能会含有较多NULL值的列可以放在最后面。可以终合考虑上面两点,根据系统的应用做相应操作。

上一篇:某些更改的非事务性表不能被回滚的现象 人气:1032
下一篇:几种解决互联网应用程序开发的好方法 人气:1144
浏览全部数据库的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐