SQL Server 2008数据库创建过程和可配置选项(五)

2014-11-24 13:29:16 · 作者: · 浏览: 14
斥的。堆是一个无组织的表行集合,而聚集索引是一个有组织的表行集合。聚集键在索引中必须是唯一的,但创建索引时不必将此列标记为唯一的。当在未标记的唯一的列上创建聚集索引时,SQL Server会生成一个隐藏列,它保存一个名为唯一标识符的4字节内部值来唯一标识重复的聚集索引键。聚集索引的叶级是实际的数据行,而不是数据指针。
  非聚集索引:非聚集索引更像是一本书后面的索引。当找到索引值时,并不能找到实际数行,只是获得指定实际数据行的位置的指针。
  堆上的非聚集索引:当在一个以堆形式组织的表上构建非聚集索引时,索引列根据指向数据实际位置的指针分类,该指针由文件ID,页ID和数据所在的页槽号组成,如数据是第一个文件行总第84593页上的第20条记录,那么SQL将使用指针值1:84593:20,这使得SQL Server能够在索引找到数据之后快速访问数据。
  聚集索引上的非聚集索引:当在一个聚集索引上构建非聚集索引时,索引中的指针值就是数据行的聚集索引键值。一旦定位到索引值,SQL Server就是用聚集键导航聚集索引来检索所有需要的列。
  包含列:非聚集索引的功能可以通过向索引的节点添加非键值得到提升,这就可使得索引覆盖更多的查询,减少为检索额外值而历遍聚集索引的次数。包含列可以提高查询覆盖率,而不会导致符合索引键的开销。索引中标记为included的列值出现在索引的页节点中,在行排序中不做考虑。
CREATE NONCLUSTERED INDEX IX_Person_LastName ON Person.Person(LastName) INCLUDE (FirstName)
  筛选索引:筛选索引时优化非聚集索引,它允许在数据子集上创建索引,使得索引结构更小从而减少了构建索引的时间和索引维护的成本,对于包含大量NULL值或包含数据范围的列上的索引,筛选索引特别有用:
CREATE NONCLUSTERED INDEX IX_ListPrice_Product ON Production.Product(ListPrice) WHERE ListPrice>800.00
  分层索引:HierarchyId是SQL Server 2008中引入的一种新类型数据。为了帮助检索分层数据,可使用两种不同的方法在此类型上的列构建索引,广度优先索引和深度优先索引。广度优先索引将统一级别的所有记录组合到一起,这样SQL Server就可以非常快速地相应具有共同父节点的所有记录的查询。
  空间索引:SQL Server 2008通过两种新的CLR数据类型支持空间索引,geometry和geography,geometry数据类型用于平面空间而geography数据类型用于地形测量空间。创建空间索引需要两个阶段:分解和镶嵌。在分解阶段,SQL Server将一个有限区域划分为一个网格结构,在镶嵌阶段,表中的每个空间值都映射到每个网格级别。
  XML索引:凭借XML上建立索引的功能,能够帮助定位和检索XML文本中的特定数据。XML数据早SQL Server数据库中存储为Binary Large Object(BLOB,二进制大型对象)。要在XML中搜索特定元素,属性或者值,SQL Server必须首先打开BLOB,然后将其内容拆解开。SQL Server通过拆解操作创建一个自己可以导航的XML对象的集合。它实质上是提取了XML的数据结构,然后将其存储在临时的关系结构中。
  XML主索引:主XML索引实际并不是构建在XML列上,而是构建在内部表(在索引创建过程中创建)之上的聚集索引。这个内部表称为节点表。节点表直接连接至在其中创建XML索引的表的聚集索引。要创建一个XML索引,具有XML列的表必须在其逐渐上有一个聚集索引。创建语法如下:
USE AdventureWorks2008
GO
CREATE PRIMARY XML INDEX XML_IX_Illustration
ON Production.Illustration(Diagram)
  PATH辅助XML索引:PATH辅助XML索引可以提升对XML列指定路径表达式的XML查询的性能。PATH辅助索引建立爱主XML索引提供的节点之上,语法如下:
USER AdventureWorks2008
GO
CREATE XML INDEX IXML_MyPerson_AdditionalContactInfo_Path ON dbo.MyPerson(AdditionalContactInfo)
USING XML INDEX PXML_MyPerson_AdditionalContactInfo FOR PATH
  VALUE辅助XML索引:VALUE辅助索引用来支持没有完全指定路径的或采用通配符来搜索值的XML查询。语法如下:
CREATE XML INDEX IXML_MyPerson_AdditionalContactInfo_Value ON dbo.MyPerson(AdditionalContactInfo) USING XML INDEX PXML_MyPerson_AdditionalContactInfo FOR VALUE
  PROPERTY辅助XML索引:PROPERTY辅助索引用于优化通过制定节点的完整路径检索节点值的查询。语法如下:
CREATE XML INDEX_IXML_MyPerson_AdditionalContactInfo_Property ON dbo.MyPerson(AdditionalContactInfo) USING XML INDEX PXML_MyPerson_AdditionalContactInfo FOR PROPERTY
维护表
  我们已经深入了解了数据在表中的组织方式和优化数据检索的方法,接下来套路如何对这个环境进行维护,表的维护基本可以分为两种:索引的维护和索引统计信息的创建和维护
  索引在更新时会变得支离破碎,这是因为索引时一个连续的、排序的数据集合。要维护索引的排序顺序,SQL Server必须分割完整的数据页以容纳更多的数据。这些也拆分导致产生了索引碎片,索引的碎片化将最终导致SQL Server在检索数据时执行过量的读取,从而造成性能低下。要检查表上的所有索引或一些特定索引的碎片,可以使用动态管理函数sys.dm_db_index_physical_stats,此函数会返回表的索引的大量信息,包括每个数据页上的数据量、索引的叶级和非叶级上的碎片量,以及索引中记录的平均大小。当擦和讯这个表值函数时,最感兴趣的是碎片级别和每一页填充的平均百分比。
SELECT {* \ column list} FROM sys.dm_db_index_physical_stats ({databae_id | NULL},{object_id | NULL},{index_id | NULL},{partition_number | NULL},{mode | NULL | DEFAULT})
DECLARE @dbID smallint,@objectID int
SET @DbID=DB_ID('AdventureWorks2008')
SET object