会员名称:  密码:   验证码:     会员注册  忘记密码? 
设为首页
加入收藏
返回首页
媒体资讯>> 业界资讯 - 会展动态 - 竞赛&活动 - IT互联网  媒体学院>> 图形图像 - 网页制作 - 网络编程 - 数据库 - 服务器 - 网络应用  作品赏析>> 视频音响 - CG动画 - UI设计 - 平面设计 - 网页设计 - 摄影映象 - 三维2D - 其它设计  媒体工作室>> 视频影像 - 音频声响 - 三维2D - 平面视觉 - 软硬技术 - 摄影映象  人物访谈>> 人物访谈 - 华夏新锐  媒体杂志>> 媒体杂志  素材图库>> 丽景佳图 - 设计素材 - 资料图库 - 矢量图库 - 动态动画 - 特色图标  酷站赏析>> 韩国网站 - 国外网站 - 国内网站  会员中心>> 会员注册 - 会员登陆
当前位置:华夏媒体 - > 媒体学院 - > 数据库 - > 其它综合 - > select返回记录的顺序
   
   
   
select返回记录的顺序 select返回记录...  [其它...]
More... 
   
网络协议X档案全集(十) 网络协议X档案...  [其它...]
不可忽视的BIOS参数设置 不可忽视的BIO...  [其它...]
微软IE浏览器非常规修改全攻略(上) 微软IE浏览器非...  [其它...]
微软IE浏览器非常规修改全攻略(下) 微软IE浏览器非...  [其它...]
网管十招 网管十招  [其它...]
微软安全问题 源自OS和IE中集成RSS 微软安全问题 ...  [其它...]
修改注册表使电脑更安全 修改注册表使电...  [其它...]
利用注册表管理IP地址 利用注册表管理...  [其它...]
有关IIS HACK的一些方法整理 有关IIS HACK的...  [其它...]
More 
select返回记录的顺序
编辑:华夏媒体     作者:未知     来源:网络     时间:2006-07-29     总浏览量:1183
文字大小:[      ]     文字颜色:      双击滚屏/单击停止

[上一页] [1] [2] [3] [4] [下一页] 

关键词:select,顺序,优化,备份,扫描,索引
文章摘要:
   当我们执行了select语句,select返回的记录的顺序对我们编程方式有较大影响,对数据库记录备份清除以及sql性能优化都有很大的关系。因此有必要明确select返回记录的顺序。本文按数据库分类讨论oracle/sybase/sql server返回记录的顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
缩略语:
IAM:index allocation map
PFS:page free space
1.简介
       当我们执行了select语句,select返回的记录的顺序对我们编程方式有较大影响,对数据库记录备份清除以及sql性能优化都有很大的关系。因此有必要明确select返回记录的顺序。
select返回记录的顺序与数据库类型有很大关系,因此以下按数据库类型分别讨论。本文主要讨论了oracle/sybase/sql server返回记录的顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
2. oracle
以下假设数据库查询优化方式均为基于rule的方式,ORACLE 采用两种访问表中记录的方式:
  a. 全表扫描 (Full Table Scan)
  全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。
  b. 通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。通常表现为按索引扫描。(Index Scan)
2.1全表扫描
如果select语句不能使用索引,则Oracle按全表扫描方式读取数据块,对于返回的结果集,oracle按rowid的大小顺序来返回记录。因此 select * from mytable 与 select * from mytable order by rowid效果是一样的
       可以通过select rowid from table得到rowid伪列,数据类型为ROWID类型。使用查询语句返回的是ROWID的扩展格式(Extended Rowid)。扩展格式的ROWID由18个字符组成。这18个字符可以按照OOOOOO.FFF.BBBBBB.SSS的格式分为4组。分别代表数据对象编号(Data Object Number),数据文件编号(Datafile Number),数据块编号(Data Block Number),记录或记录片断的块内行号。
       必须说明的是,并不是后插入记录的rowid就越大,有可能后插入的记录rowid还要小。下面给出两个论点加以证明:
1.后插入的记录块内行号可能大,也可能小
根据我们的试验,假设现在表中有三条记录假设文件号相同,按块号,行号排列如下:
108 0
108 1
108 2
删除中间一条记录后,得到
108 0
108 2
再增加一条记录,可能会得到
108 0
108 1  <---新增加的记录
108 2
也可能是
108 0
108 2
108 3  <---新增加的记录
两种情况均有可能出现,取决于oracle块内的分配算法。关于该情况的更深入的分析可以参见文献2。
2.后插入的记录的块号有可能大,有可能小
       插入记录的块号并不是线性增加的,而是受FreeList控制。有关FreeList的理论和算法可以参见文献1。
       
因此对于全表扫描可以得出以下结论:
1.         在oracle中 select * from mytable不能保证返回的记录顺序是按插入的先后顺序,而是按rowid顺序。
rowid的顺序与记录行存储的“物理序”一致。在没有索引情况下,select作全表扫描,是按“物理序”,此时select 返回记录按“物理序”最快。
2.         对于已经插入的记录其ROWID不会发生变化。
如果全表扫描方式下,直接使用rownum作为选择条件,根据结论1,两次得到的记录可能是不一样的。如果sql有时间条件或其他条件作为sql语句辅助的筛选(排出当前插入的值),那么再用rownum作为选择条件,则返回的记录及记录的顺序均是一样的。
结论2的特性可用于某些日志表的清除-备份机制中。对于某些日志表为了提高insert性能,可能没有索引,并且在存储过程中对这些日志表进行清除和备份。利用insert into select 先将部分记录选入到备份表中,再用delete语句删除日志表中的记录。通过rownum来控制操作的行数,避免回滚段问题,通过时间条件来实施结论2,保证记录一致。
2.2按索引扫描
对于一段范围的按索引选择,在oracle内部表现为索引叶节点的扫描,索引叶节点通常已经排序并且叶节点之间存在指针,便于扫描。由于此时select按索引扫描表,因此返回的记录就按“索引序”排列。
利用上述特征,对于按索引扫描可以有以下的应用方式:
1.通过索引可以使返回记录事先排序。


[上一页] [1] [2] [3] [4] [下一页] 

打印   收藏   关闭   至顶部  


关于我们 | 联系我们 | 合作伙伴 | 站点地图 | 免责声明 | 版权声明 | 意见建议
版权所有  Copyright © 2005-2006 华夏媒体(Media86.Com). All Rights Reserved .
网站备案号:粤ICP备06055307号