CNET中国旗舰网站

ZDNet China | CNET科技资讯网 | 政府采购 | 行业网站联盟




 
标题: [分享] Oracle数据库中创建表时怎样考虑列顺序
看不穿
忠诚会员
Rank: 9Rank: 9Rank: 9



UID 268516
精华 0
积分 8471
帖子 557
威望 4096
ZD币 962 元
阅读权限 200
注册 2007-11-17
状态 离线
  楼主
发表于 2007-12-6 17:01  资料  个人空间  短消息  加为好友 
开发者在线

Oracle数据库中创建表时怎样考虑列顺序

创建一个表时表中列的顺序在某些程度上对性能会有一定的影响。(表中的列有数据) 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 1179alter system dump datafile 13 block 1180
得出来的文件在UDUMP中。 我们查看如下信息:
block_row_dump:tab 0, row 0, @0x1f20tl: 96 fb: --H-FL-- lb: 0x0 cc: 13--------row header信息.col 0: [ 3] 53 59 53-------------------COLUMN DATAfb: --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 memberH = Head piece of rowD = Deleted rowF = First data pieceL = Last data pieceP = First column continues from previous pieceN = Last column continues in next piecelb: 0x0-----------LOCK BYTE,锁信息cc: 13------------COLUMN COUNTcol 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 onSQL> 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.30SQL> 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----------- ------------ 350010SQL> alter system dump datafile 3 block 50011;System altered.
然后查看DUMP出来的文件的相关信息:
block_row_dump:tab 0, row 0, @0x7b2tl: 6 fb: --H-FL-- lb: 0x1 cc: 2col 0: *NULL*--------------第一列的NULLcol 1: [ 1] 80----------------第二列的值(后面没有了第三列的值)end_of_block_dump
结论:创建一个表时,可以将我们经常访问到的列放在表的前面。一般很少直接SELECT出来的PRIMARY KEY列可以放到中间来。列中如果可能会含有较多NULL值的列可以放在最后面。可以终合考虑上面两点,根据系统的应用做相应操作。




顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
nana001
中级会员
Rank: 1



UID 329938
精华 0
积分 483
帖子 62
威望 156
ZD币 81 元
阅读权限 30
注册 2008-5-27
状态 离线
  沙发
发表于 2008-6-30 18:30  资料  个人空间  短消息  加为好友 

oreilly head first 系列 原版 电子书





顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
 


操作系统 数据库 中间件 应用软件 管理软件 Web应用 AJAX Linux Web2.0 RIA 开源 SOA OSS SEO Vista SharePoint Windows Server Windows 2003 Windows 2008 IIS 动态语言 Windows IE7 Oracle Oracle11g office SQLServer Firefox Solaris Ubuntut 微软Google 资讯 博客 技术看板 英雄 图片 QQ 腾讯QQ 珊瑚虫QQ 金山上市 站点图 AJAX BI BPM CRM DNS Android SQL Server 2008 EAI Enterprise 2.0 ETL ERP Flash GPL3 Java j2me JavaEE LAMP mashups NTFS ODBC ODF OOP Outsourcing RIA RSS SOA UML Web2.0 Workflow XAML XML ZFS 备份 并发控制 并行计算 动态语言 多核计算 虚拟技术 CRM 数据仓库 虚拟化 Apollo Apache BizTalk DB2 Eclipse Excel Expression Flex3 Fedora7 Forefront FreeBSD Hibernate IE 7 IIS JavaFX JBoss Linspire live Maxthon Mobile 6.0 Mozilla MySQL office OneCare OpenOffice Solaris Oracle Oracle 11g SQL Server Opera Outlook Photoshop PostgreSQL PowerBuilder PowerShell Rational RHEL ROR Salesforce Server Core Solaris SugarCRM TFS Tomcat Ubuntut Vista VMWare VPC VSTS WCF WebLogic WPF Xandros Xen KDE GNOME 火狐浏览器 Gmail 邮箱 Exchange server AJAX BI BPM EAI ETL ERP CRM DNS Flash Java JavaEE j2me LAMP NTFS ODBC ODF OOP Outsourcing RIA RSS SOA SEO Web2.0 mash up Workflow XAML XML GPL 3协议 ZFS 备份 并行计算 多核 数据仓库 搜索 并发控制 并行计算 动态语言 虚拟化 虚拟技术 Enterprise Web2.0 软件技术资讯 操作系统 Windows Server 2008 Windows Server 2008专题 系统安全 IIS 虚拟机 Windows Linux 嵌入式操作系统 Vista专区 数据库/数据仓库 MySQL & PostgreSQL & Sybase Oracle 10g / 9i / 11g SQL SERVER DB2 中间件/SOA QQ2009下载 QQ QQ群 QQ炫铃 QQ视频 QQ好友 木马病毒 QQ2007 江民 瑞星 金山毒霸 协作办公 ODF/OOXML SharePoint office web应用 浏览器 SaaS/S+S Microsoft技术 操作系统软件数据库软件中间件软件

软件频道2008年3月精华 软件频道2008年2月精华 软件频道2008年1月精华 软件频道12月精华 软件频道11月精华 软件频道10月精华 软件频道9月精华 软件频道8月精华 软件频道7月精华 软件频道6月精华 软件频道5月精华 软件频道4月精华 软件频道3月精华 软件频道2月精华 软件频道1月精华


当前时区 GMT+8, 现在时间是 2008-9-8 07:05

  Powered by Discuz! 5.5.0 © 2001-2007 Comsenz Inc.
Processed in 2.535458 second(s), 8 queries

清除 Cookies - 联系我们 - ZDNetChina中文社区 - 无图版