select返回记录的顺序(原创)

本文详细探讨了Oracle、Sybase和SQL Server在执行SELECT语句时返回记录的顺序,涉及全表扫描、索引扫描等不同情况。对于Oracle,全表扫描按ROWID顺序返回记录,索引扫描按索引顺序返回。Sybase和SQL Server会根据代价选择是否使用索引,返回顺序可能因索引和执行计划而异。了解这些顺序对于数据库性能优化和备份策略至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select返回记录的顺序

中兴通讯重庆研究所 游波 吴育红

关键词:select,顺序,优化,备份,扫描,索引

文章摘要:

   当我们执行了select语句,select返回的记录的顺序对我们编程方式有较大影响,对数据库记录备份清除以及sql性能优化都有很大的关系。因此有必要明确select返回记录的顺序。本文按数据库分类讨论oracle/sybase/sql server返回记录的顺序,从原理探讨三种数据库各自的特点,并着重探讨了这些差异对数据查询及记录备份的影响。

缩略语:

IAMindex allocation map

PFSpage 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按全表扫描方式读取数据块,对于返回的结果集,oraclerowid的大小顺序来返回记录。因此 select * from mytable select * from mytable order by rowid效果是一样的

       可以通过select rowid from table得到rowid伪列,数据类型为ROWID类型。使用查询语句返回的是ROWID的扩展格式(Extended Rowid)。扩展格式的ROWID18个字符组成。这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

### 回答1: MySQLSELECT语句执行顺序如下: 1. FROM:指定要查询的表或视图。 2. JOIN:如果查询涉及到多个表,需要使用JOIN关键字将它们连接起来。 3. WHERE:指定查询条件,只有符合条件的记录才会被返回。 4. GROUP BY:按照指定的列对结果进行分组。 5. HAVING:指定分组后的条件,只有符合条件的分组才会被返回。 6. SELECT:指定要查询的列。 7. DISTINCT:去除重复的记录。 8. ORDER BY:指定结果的排序方式。 9. LIMIT:指定返回结果的数量。 以上是MySQL SELECT语句的执行顺序,需要注意的是,不是所有的SELECT语句都需要按照这个顺序执行,有些语句可能会省略其中的一些步骤。 ### 回答2: MySQLSELECT语句执行顺序可以分为以下9个步骤: 1. 执行FROM子句,获取表中的数据。 2. 执行WHERE子句,筛选出符合条件的数据。 3. 执行GROUP BY子句,将数据按照指定的列进行分组。 4. 执行HAVING子句,筛选出符合条件的分组。 5. 执行SELECT子句,选择需要查询的列。 6. 执行DISTINCT关键字,去除重复的行。 7. 执行ORDER BY子句,按照指定的列对结果集进行排序。 8. 执行LIMIT子句,指定返回的结果数量。 9. 最后输出查询结果。 需要注意的是,执行顺序并不一定按照上述顺序执行,某些步骤可能被优化或者省略,例如如果查询中没有WHERE子句,则不需要执行WHERE子句。此外,MySQL还支持查询缓存,如果查询缓存中已经存在相同的查询结果,则直接返回缓存结果,不需要执行上述步骤。 在优化查询性能时,可以使用多种技巧来优化各个步骤。例如,可以使用索引来加速查询的WHERE条件,使用分区表来加速GROUP BY操作,使用EXPLAIN关键字来分析查询性能等。 ### 回答3: MySQLSELECT语句是关系型数据库中最常用的查询语句,在操作数据时必须掌握其执行顺序SELECT语句的执行顺序分为以下六个步骤: 1. FROM子句:指定要查询的表及其所在的数据库。如果在查询时使用了多个表,那么就需要使用JOIN等操作将这些表联接起来。 2. JOIN子句:根据指定的连接条件将要查询的表连接起来。JOIN子句在FROM子句之后执行,但是在WHERE子句之前执行。 3. WHERE子句:指定查询的条件。WHERE子句在JOIN子句之后执行,但是在GROUP BY子句之前执行。 4. GROUP BY子句:将查询的结果分组。GROUP BY子句在WHERE子句之后执行,但是在HAVING子句之前执行。 5. HAVING子句:指定按组过滤后的查询结果。HAVING子句在GROUP BY子句之后执行,但是在SELECT子句之前执行。 6. SELECT子句:指定要查询的列及其计算方式。SELECT子句在所有子句中最后执行。 需要注意的是,SELECT语句中的ORDER BY子句并不是查询执行顺序的一部分,而是在查询结束后对查询结果进行排序的语句。因此,ORDER BY子句总是在SELECT语句执行完毕之后执行。 总之,了解SELECT语句的执行顺序是操作关系型数据库的基本要求,只有深入理解每个步骤的顺序,才能更好地优化数据库查询的效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值