<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
select 返回记录的 顺序
中兴通讯重庆研究所游波吴育红
关键词: select, 顺序,优化,备份,扫描,索引
文章摘要:
当我们执行了 select语句, select返回的记录的 顺序对我们方式有较大影响,对记录备份清除以及sql性能优化都有很大的关系。因此有必要明确 select 返回记录的 顺序。本文按数据库分类讨论oracle/sybase/sqlserver 返回记录的 顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
缩略语:
IAM:indexallocationmap
PFS:pagefreespace
1.简介
当我们执行了 select语句, select返回的记录的 顺序对我们编程方式有较大影响,对数据库记录备份清除以及sql性能优化都有很大的关系。因此有必要明确 select 返回记录的 顺序。
select 返回记录的 顺序与数据库类型有很大关系,因此以下按数据库类型分别讨论。本文主要讨论了oracle/sybase/sqlserver 返回记录的 顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
2.oracle
以下假设数据库查询优化方式均为基于rule的方式,ORACLE采用两种访问表中记录的方式:
a.全表扫描(FullTableScan)
全表扫描就是 顺序地访问表中每条记录.ORACLE采用一次读入多个数据块(databaseblock)的方式优化全表扫描。
b.通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。通常表现为按索引扫描。(IndexScan)
2.1全表扫描
如果 select语句不能使用索引,则按全表扫描方式读取数据块,对于返回的结果集,oracle按rowid的大小 顺序来 返回记录。因此 select*frommytable与 select*frommytableorderbyrowid效果是一样的
可以通过 selectrowidfromtable得到rowid伪列,数据类型为ROWID类型。使用查询语句返回的是ROWID的扩展格式(ExtendedRowid)。扩展格式的ROWID由18个字符组成。这18个字符可以按照OOOOOO.FFF.BBBBBB.SSS的格式分为4组。分别代表数据对象编号(DataObjectNumber),数据文件编号(DatafileNumber),数据块编号(DataBlockNumber),记录或记录片断的块内行号。
必须说明的是,并不是后插入记录的rowid就越大,有可能后插入的记录rowid还要小。下面给出两个论点加以证明:
1.后插入的记录块内行号可能大,也可能小
根据我们的试验,假设现在表中有三条记录假设文件号相同,按块号,行号排列如下:
1080
1081
1082
删除中间一条记录后,得到
1080
1082
再增加一条记录,可能会得到
1080
1081 <---新增加的记录
1082
也可能是
1080
1082
1083 <---新增加的记录
两种情况均有可能出现,取决于oracle块内的分配算法。关于该情况的更深入的分析可以参见文献2。
2.后插入的记录的块号有可能大,有可能小
插入记录的块号并不是线性增加的,而是受FreeList控制。有关FreeList的理论和算法可以参见文献1。
因此对于全表扫描可以得出以下结论:
1. 在oracle中 select*frommytable不能保证返回的记录 顺序是按插入的先后 顺序,而是按rowid 顺序。
rowid的 顺序与记录行存储的“物理序”一致。在没有索引情况下, select作全表扫描,是按“物理序”,此时 select 返回记录按“物理序”最快。 1
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
select 返回记录的 顺序
中兴通讯重庆研究所游波吴育红
关键词: select, 顺序,优化,备份,扫描,索引
文章摘要:
当我们执行了 select语句, select返回的记录的 顺序对我们方式有较大影响,对记录备份清除以及sql性能优化都有很大的关系。因此有必要明确 select 返回记录的 顺序。本文按数据库分类讨论oracle/sybase/sqlserver 返回记录的 顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
缩略语:
IAM:indexallocationmap
PFS:pagefreespace
1.简介
当我们执行了 select语句, select返回的记录的 顺序对我们编程方式有较大影响,对数据库记录备份清除以及sql性能优化都有很大的关系。因此有必要明确 select 返回记录的 顺序。
select 返回记录的 顺序与数据库类型有很大关系,因此以下按数据库类型分别讨论。本文主要讨论了oracle/sybase/sqlserver 返回记录的 顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。
2.oracle
以下假设数据库查询优化方式均为基于rule的方式,ORACLE采用两种访问表中记录的方式:
a.全表扫描(FullTableScan)
全表扫描就是 顺序地访问表中每条记录.ORACLE采用一次读入多个数据块(databaseblock)的方式优化全表扫描。
b.通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。通常表现为按索引扫描。(IndexScan)
2.1全表扫描
如果 select语句不能使用索引,则按全表扫描方式读取数据块,对于返回的结果集,oracle按rowid的大小 顺序来 返回记录。因此 select*frommytable与 select*frommytableorderbyrowid效果是一样的
可以通过 selectrowidfromtable得到rowid伪列,数据类型为ROWID类型。使用查询语句返回的是ROWID的扩展格式(ExtendedRowid)。扩展格式的ROWID由18个字符组成。这18个字符可以按照OOOOOO.FFF.BBBBBB.SSS的格式分为4组。分别代表数据对象编号(DataObjectNumber),数据文件编号(DatafileNumber),数据块编号(DataBlockNumber),记录或记录片断的块内行号。
必须说明的是,并不是后插入记录的rowid就越大,有可能后插入的记录rowid还要小。下面给出两个论点加以证明:
1.后插入的记录块内行号可能大,也可能小
根据我们的试验,假设现在表中有三条记录假设文件号相同,按块号,行号排列如下:
1080
1081
1082
删除中间一条记录后,得到
1080
1082
再增加一条记录,可能会得到
1080
1081 <---新增加的记录
1082
也可能是
1080
1082
1083 <---新增加的记录
两种情况均有可能出现,取决于oracle块内的分配算法。关于该情况的更深入的分析可以参见文献2。
2.后插入的记录的块号有可能大,有可能小
插入记录的块号并不是线性增加的,而是受FreeList控制。有关FreeList的理论和算法可以参见文献1。
因此对于全表扫描可以得出以下结论:
1. 在oracle中 select*frommytable不能保证返回的记录 顺序是按插入的先后 顺序,而是按rowid 顺序。
rowid的 顺序与记录行存储的“物理序”一致。在没有索引情况下, select作全表扫描,是按“物理序”,此时 select 返回记录按“物理序”最快。 1
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>