- ·上一篇文章:Transact_SQL小手册,适合初学者
- ·下一篇文章:FreeBSD下安装PostgreSQL新手教程
日期:2005-11-25 13:44:13 来源:源码之村
select返回记录的顺序
对于插入操作,当SQL Server 2000 需要插入新行而当前页没有可用空间时,它使用 IAM 和 PFS 页查找具有足够空间容纳该行的页。SQL Server 使用 IAM 页查找分配给对象的扩展盘区。对于每个扩展盘区,SQL Server 搜索 PFS 页以查看是否有一页具有足够的空间容纳这一行。
SQL Server 只有当无法在现有的扩展盘区内快速找到一页有足够空间容纳正插入的行时,才给对象分配新的扩展盘区。SQL Server 使用按比例分配算法,从文件组内的可用扩展盘区中分配扩展盘区。如果一个文件组有两个文件,其中一个的可用空间是另一个的两倍,那么每从后者分配一页,就从前者分配两页。这意味着文件组内的每个文件应该有近似的空间使用百分比。
对于删除操作,在堆表中,即使删除了记录,该记录所在页不会作页内移动。
对于数据更新,SQL Server可以采用多种方式来进行。更新可能是现场发生的,也可能是以先删除然后插入的方式进行的,还可以是通过查询处理器或存储引擎来管理更新。但是在堆表中,总是采用现场更新方式,对于更新的内容原来的页不能容纳的情况,sql server 2000采用转向指针处理,保证了更新后该记录位置的不变。
通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆集扫描一律沿每个文件进行。
根据上述堆表的插入、更新、删除、扫描原则,可以得到以下的结论:
1.使用 IAM 页设置扫描顺序意味着堆集中的行一般不按照插入的顺序返回。
2.对于已经存在的记录,记录的位置(数据库号,文件号,页号,行号)不会变化。
结论2可应用到备份-清除机制中。如果日志表是没有索引的堆表,就可以通过时间、流水号等字段排除当前插入的记录,使select和delete两次操作返回的结果集及顺序完全一致,再通过set rowcount来控制每次操作的记录条数,使得备份-清除操作能够安全进行。
4.2有索引的表
对于Sql Server 执行计划没有带索引的表,select返回记录的顺序和堆表扫描返回的顺序相同。
对于Sql Server 执行计划带索引的表,select 按索引字段的顺序返回记录。SQL Server将索引组织为 B 树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B 树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。
对于有索引的表,得到以下结论:
1.可以通过控制索引来控制查询方式,从而控制返回顺序。
如我们可以通过with(index(index_name))来指定对某个索引的使用,从而达到按索引index_name排序。
2.如何没有强制指定索引,不管你的select 语句中是否在where后面使用了索引,Sql Server均可能基于代价对索引的使用进行调整,即使没有where语句也有可能使用索引,即使有where语句也有可能不用索引。不管你的delete 语句中是否在where后面使用了索引,Sql Server均可能基于代价对索引的使用进行调整,即使没有where语句也有可能使用索引,即使有where语句也有可能不用索引。带相同where语句的select 和 delete 执行计划很可能不一样。
因此select 和 delete 得到的记录顺序很可能不一致,如果要选取前n条记录,那么得到的记录集尽管条数一致但内容不一致。尽管我们可以通过with(index(index_name))来强制select对索引的使用,但delete却不能够强制指定索引,因为delete涉及对索引本身的删除。
这种情况下,如果数据库的性能够好,要备份的数据不多,就不要使用set rowcount来控制条数。但如果确需要控制一次删除的条数,可以直接在where条件中控制更小的范围,如时间范围控制到小时,一天的数据通过24小时的循环来备份。
要么采用DTS作备份。
3.如果需要排序的字段是聚簇索引,那么就可以放心使用该索引完成排序。这时,不论执行计划怎样,sql server均按聚簇索引字段顺序返回记录。
SQL Server 只有当无法在现有的扩展盘区内快速找到一页有足够空间容纳正插入的行时,才给对象分配新的扩展盘区。SQL Server 使用按比例分配算法,从文件组内的可用扩展盘区中分配扩展盘区。如果一个文件组有两个文件,其中一个的可用空间是另一个的两倍,那么每从后者分配一页,就从前者分配两页。这意味着文件组内的每个文件应该有近似的空间使用百分比。
对于删除操作,在堆表中,即使删除了记录,该记录所在页不会作页内移动。
对于数据更新,SQL Server可以采用多种方式来进行。更新可能是现场发生的,也可能是以先删除然后插入的方式进行的,还可以是通过查询处理器或存储引擎来管理更新。但是在堆表中,总是采用现场更新方式,对于更新的内容原来的页不能容纳的情况,sql server 2000采用转向指针处理,保证了更新后该记录位置的不变。
通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆集扫描一律沿每个文件进行。
根据上述堆表的插入、更新、删除、扫描原则,可以得到以下的结论:
1.使用 IAM 页设置扫描顺序意味着堆集中的行一般不按照插入的顺序返回。
2.对于已经存在的记录,记录的位置(数据库号,文件号,页号,行号)不会变化。
结论2可应用到备份-清除机制中。如果日志表是没有索引的堆表,就可以通过时间、流水号等字段排除当前插入的记录,使select和delete两次操作返回的结果集及顺序完全一致,再通过set rowcount来控制每次操作的记录条数,使得备份-清除操作能够安全进行。
4.2有索引的表
对于Sql Server 执行计划没有带索引的表,select返回记录的顺序和堆表扫描返回的顺序相同。
对于Sql Server 执行计划带索引的表,select 按索引字段的顺序返回记录。SQL Server将索引组织为 B 树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B 树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。
对于有索引的表,得到以下结论:
1.可以通过控制索引来控制查询方式,从而控制返回顺序。
如我们可以通过with(index(index_name))来指定对某个索引的使用,从而达到按索引index_name排序。
2.如何没有强制指定索引,不管你的select 语句中是否在where后面使用了索引,Sql Server均可能基于代价对索引的使用进行调整,即使没有where语句也有可能使用索引,即使有where语句也有可能不用索引。不管你的delete 语句中是否在where后面使用了索引,Sql Server均可能基于代价对索引的使用进行调整,即使没有where语句也有可能使用索引,即使有where语句也有可能不用索引。带相同where语句的select 和 delete 执行计划很可能不一样。
因此select 和 delete 得到的记录顺序很可能不一致,如果要选取前n条记录,那么得到的记录集尽管条数一致但内容不一致。尽管我们可以通过with(index(index_name))来强制select对索引的使用,但delete却不能够强制指定索引,因为delete涉及对索引本身的删除。
这种情况下,如果数据库的性能够好,要备份的数据不多,就不要使用set rowcount来控制条数。但如果确需要控制一次删除的条数,可以直接在where条件中控制更小的范围,如时间范围控制到小时,一天的数据通过24小时的循环来备份。
要么采用DTS作备份。
3.如果需要排序的字段是聚簇索引,那么就可以放心使用该索引完成排序。这时,不论执行计划怎样,sql server均按聚簇索引字段顺序返回记录。
Tags:
作者:无从考证评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论
