sqlserver2005 学习笔记
sqlserver 在生成每一个Instance时会同时生成Master/model/tempdb/msdb四个系统数据库。
tempdb,
1、tempdb是一个临时数据库,为了保证有连接查询(join),临时表、group,distinct,order by ,nested query等操作的系统性能(这些操作都在这个库里完成,所以其存取操作很频繁),系统一般需要保证tempdb有足够的空间,当tempdb需要增长空间时,可能会导致外来性碎片(因不能保证剩余部分的连续性)。
2、尽可能把tempdb的数据文件放到io写入具有快速响应能力的设备上,如raid0或raid0+上。
表组织和索引结构
SQLServer里的表和索引以一系列8K的页的形式存储。表和索引结构的详细介绍在SQLServer的帮助文档里已给出。表组织和索引结构这两方面跟性能有重大的关联,做一下简短的介绍。表要么作为堆要么作为聚集索引来组织。表要么有聚集索引要么没有(视图索引稍后讨论)。没有聚集索引的表称为堆。堆里的行不是按顺序存放的。图1-1显示了堆表的组织结构。

在有聚集索引的表里,行是基于键值顺序存放的。聚集索引的根和任何中间层有索引值。叶级有整个数据行,除在某些环境下的text和image数据库类型外。图1-2显示了有聚集索引的表的组织结构。
图1-2聚集索引表结构
非聚集索引里的信息依赖于表是堆表还是聚集索引表。对于堆表来说,非聚集索引有一个指向行的指针包括文件、页和行位置。图1-3显示了堆上的非聚集索引。注意根和页节点属于非聚集索引。索引中间层没有显示。数据页属于堆表。
图1-3建在堆表上的非聚集索引
对于聚集索引表来说,非聚集索引包含了聚集索引键。跟随非聚集索引搜索的书签查找操作的性能依赖于表的组织形式。如果是堆表,书签查找真正是一个查找操作。如果是聚集索引表,书签查找是在聚集索引上附加的索引搜索操作。
一、堆
1、sqlserver在sysindexes表中查到对应的数据行
2、读取indid值(应为堆没有索引所以是0)后,sqlserver开始读取firstIAM值,获取堆的IAM的第一页(8KB)的位置。(IAM将堆的各个区域联接在一起)
3、sqlserver根据IAM提供的区域地址,一个区域一个区域的查找,一个数据页一个数据页的查找,直到获取所需的数据为止。
二、聚集索引
1、sqlserver在sysindexes表中查到对应的数据行,找到indid为1后,sqlserver开始读取root列的值。(列值是根页面的地址)
2、找到根页面后开始搜索,比如要搜索的表是10条记录一页,这里是找“1981”这个值,将索引的值“1981”与根页面的索引比较。由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。
3、找到“1900”所在的中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的数据页。(注意这一步是根据中间页找数据页)
4、找到“1980”所在的数据页后,将索引值“1981”继续与数据页的索引比较,很快就可以在这个数据页上找到“1981”的数据行了。
三、非簇索引
1、sqlserver在sysindexes表中查到对应的数据行,找到indid为后,值为2到251后,sqlserver开始读取root列值。
2、找到根页面后,将“1981”与根页面的索引比较,由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。(注意这一步是根据中间页找叶页面)
3、找到中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的叶页面。
4、找到“1980”所在的叶页面后,继续叫索引值“1981”与叶页面上的关键字比较,在叶页面上找到关键字为“1981”的数据行ID。
5、根据数据行ID提供的数据页和数据行信息,定位到指定的数据页和数据行,找到“1981”这条记录是“晶”的。
posted on 2008-09-08 01:24 Yongming.dai 阅读(330) 评论(0) 收藏 举报
浙公网安备 33010602011771号