)
《Microsoft Sql server 2008 Internals》索引目录《Microsoft Sql server 2008 Internals》读书笔记--目录索引在第五章主要学习了table的内部存储结构第七章《Special storage》中将继续深入学习存储机制那将是本书最难理解的一章。第六章主要介绍index的基础知识第八章是《query Optimizer》,下面我们先来看看第六章Indexes:Internals and Management。这一章分为三部分1、介绍Index的使用、概念和内部构造,你也将了解索引如何被存储和它们是如何被检索的。2、深入了解数据被修改时内部存储发生了什么是如何发生的以及SQL Server如何确保一致性(consistence)。你还将了解到修改数据的索引对性能的的潜在影响比如整理。3、索引的管理和维护。前言索引的好处是不言而喻的。一个良好的索引可能将你的查询请求从数百万的I/O下降到few甚至更少。同样一个过度的索引设计(over-indexing)比起不用索引可能后果更为严重。因此掌握必要的索引物理存储及存储引擎、策略、优化知识对于一个SQL设计人员是至关重要的。首先我们来一起学习第一部分索引分为聚集索引 (clustered index)和非聚集索引(nonclustered index)两种在聚集索引的表中表数据是按照聚集键排序被逻辑存放的。当你找到你要的数据时搜索同时完成。而非聚集索引的表中。索引结构是完全和数据自身分离的。当你开始查找索引的时候你必须按照某些引用指针(Reference Pointer)的排序得到实际的数据。关于如何创建索引(index)请查阅MSDN:http://msdn.microsoft.com/zh-cn/library/ms188783.aspx◆SQL Server Index B-Tree在SQL Server中索引被按照B-Tree结构组织B-Tree即(balanced-tree),SQL Server使用一种特殊的Btree结构。不像通常的树B-Tree总是倒的(inverted)它的根root(单个page)在顶部,叶(Leaf)在底部。中间级别的level取决于多种因素。B-Tree是一个在不同场合被重载(overload)的词,在本书中。它意味着整个的索引结构如下图所示重要的是我们需要理解SQL Server中B-Tree是如何被构建的(constructed)以及每一个Level中包含什么。我们通过一些简单的概念入手。首先索引有两个很基本的组件一个叶级(leaf level)一个或多个非叶级(non-leaf levels)。后者主要用于叶级的导航。此外第一个中间级(first intermediate level)也被用于整理分析和在大序列索引查询的驱动预读(read-ahead)。非页级(non-leaf Level)的存在主要是为了在叶级帮助迅速导航到一行的架构而不是直接到数据本身。每个非页级存储了自下而上在每一页(page),直到Root级被创建。越高的级即距离leaf越远的存放更少的信息, 因为每个处于该级的行只包含位于下一级的最小键值加一个指针。实际上这些key最多900字节或16个列在SQL Server中有助于保持索引树相对的小。下面我们使用一个包含1,000,000即1百万“行”的索引的叶级为例。首先我们得明确无论是leaf leave还是non-leaf level都是被存储在SQL Server pages(8KB pages)中。在这个例子中non-leaf“‘ 行”将有4000字节。也就是说每页只能存储两行。对于一个百万“行”的表而言我们的索引的叶级将有500,000页。相对而言这是一个非常宽的行结构然而我们并没有浪费很大的空间。假如我们叶级页有两个3,000字节的行我们仍然每页两“行”于是我们将浪费2,000字节的空间。注意这里为什么用行而不用数据行(Data Rows)这是因为这个页级可能是聚集索引这自然就等于数据行也可能这些叶级行是一些非聚集索引的包含性非键值列被加到索引的叶级中的行。当包含性列被使用时叶级页可以包含更宽的行超过900字节或16列限制。在本例中索引创建时页级将是4GB大小(500,000个8kb大小的page)。如果使用最大限制那么最后长到Root的树将会更小并且最多有8个级如下■ Root page of non-leaf level(Level 7)2 rows1 page(8 rows per page)■ Intermediate page of non-leaf level(Level 6)16 rows2 page(8 rows per page)■ Intermediate non-leaf level(Level 5)123 rows16 page(8 rows per page)■ Intermediate non-leaf level(Level 4)977 rows123 page(8 rows per page)■ Intermediate non-leaf level(Level 3)7,813 rows977 page(8 rows per page)■ Intermediate non-leaf level(Level 2)6,2500 rows7,813 page(8 rows per page)■ Intermediate non-leaf level(Level 1)50,000 rows6,2500 page(8 rows per page)■ Leaf level(Level 0)1,000,000 rows500,000 page(8 rows per page)更小的键大小将会有更快的级别以同样数据为例如果有更小的索引键将在非叶级带来更小的行大小因此可以存储更多的行。如果只有20字节将可以每而存储404行数据■ Root page of non-leaf level(Level 3)4 rows1 page(404 rows per page)■ Intermediate non-leaf level(Level 2)1,238 rows4 page(404 rows per page)■ Intermediate non-leaf level(Level 1)50,000 rows1,238 page(404 rows per page)■ Leaf level(Level 0)1,000,000 rows500,000 page(2 rows per page)请记住更窄而不是更宽的键(key)将给索引带来更好的效率。最重要的是索引的大小即级的数量取决于三点1、索引定义。2、基表(table)是否有一个聚集索引。3、索引叶级的page数量。其中叶级页的数量直接表中行大小和行数量。这并不是说在索引中一定要使用窄索引。有时还要适当使用宽索引。此外像包含性列和filtered indexes也会影响索引的大小和用途。当然最重要的是使用正确的索引。不是吗分析索引的工具(Tools for Analyzing Indexes)一、使用sys.dm_db_index_physical_statsselect * from sys.dm_db_index_physical_stats(DB_ID(testdb),null,null,null,null);关于sys.dm_db_index_physical_stats的更多使用请参看MSDNhttp://msdn.microsoft.com/zh-cn/library/ms188917.aspx二、使用DBCC IND命令,这是一个MSDN未公开的命令。exec (DBCC IND(testdb,[dbo.Fixed],-1))下一节将继续学习物理索引结构(physical Index Structure)。邀月注本文版权由邀月和CSDN共同所有转载请注明出处。助人等于自助! 3wlive.cn