《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

《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使用一种特殊的B+tree结构。不像通常的树,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 rows=1 page(8 rows per page)

■ Intermediate page of non-leaf level(Level 6)=16 rows=2 page(8 rows per page)

■ Intermediate  non-leaf level(Level 5)=123 rows=16 page(8 rows per page)

■ Intermediate  non-leaf level(Level 4)=977 rows=123 page(8 rows per page)

■ Intermediate  non-leaf level(Level 3)=7,813 rows=977 page(8 rows per page)

■ Intermediate non-leaf level(Level 2)=6,2500 rows=7,813 page(8 rows per page)

■ Intermediate  non-leaf level(Level 1)=50,000 rows=6,2500 page(8 rows per page)

■ Leaf  level(Level 0)=1,000,000 rows=500,000 page(8 rows per page)

更小的键大小将会有更快的级别,以同样数据为例,如果有更小的索引键将在非叶级带来更小的行大小,因此可以存储更多的行。如果只有20字节,将可以每而存储404行数据:

■ Root page of non-leaf level(Level 3)=4 rows=1 page(404 rows per page)

■ Intermediate non-leaf level(Level 2)=1,238 rows=4 page(404 rows per page)

■ Intermediate  non-leaf level(Level 1)=50,000 rows=1,238 page(404 rows per page)

■ Leaf  level(Level 0)=1,000,000 rows=500,000 page(2 rows per page)

请记住:更窄而不是更宽的键(key)将给索引带来更好的效率。最重要的是:索引的大小(即级的数量)取决于三点:1、索引定义。2、基表(table)是否有一个聚集索引。3、索引叶级的page数量。其中,叶级页的数量直接表中行大小和行数量。这并不是说在索引中一定要使用窄索引。有时还要适当使用宽索引。此外,像"包含性列"和filtered indexes也会影响索引的大小和用途。当然,最重要的是,使用正确的索引。不是吗?

分析索引的工具(Tools for Analyzing Indexes)

一、使用sys.dm_db_index_physical_stats

[python] view
plain
copyprint?

  1. select * from sys.dm_db_index_physical_stats(DB_ID(‘testdb‘),null,null,null,null);

关于sys.dm_db_index_physical_stats的更多使用,请参看MSDN:

http://msdn.microsoft.com/zh-cn/library/ms188917.aspx

二、使用DBCC IND命令,这是一个MSDN未公开的命令。

[python] view
plain
copyprint?

  1. exec (‘DBCC IND(testdb,[dbo.Fixed],-1)‘)

下一节将继续学习物理索引结构(physical Index Structure)。

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。

助人等于自助!   [email protected]

转自:http://blog.csdn.net/downmoon/article/details/5280152

《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

时间: 2024-10-14 23:02:04

《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)的相关文章

Microsoft SQL Server 2008/2012 Internals 一处疑问

Kalen Delaney 等著的深入解析 Microsoft SQL Server 系列,享有盛誉,深入研读,是管窥深奥复杂之 SQL Server 的阶梯与门径.手头有 Microsoft SQL Server 2008 Internals 影印版,也有 Microsoft SQL Server 2012 Internals 电子版,相互参照,辅之以实际演练,受益匪浅. 但有一处,与实际演练情形有所出入.Microsoft SQL Server 2008/2012 Internals 在 2

Microsoft SQL Server 2008安装图解(Windows 7)(转载)

FoxDie 2010年04月17日 简介 本文详细记录了一次完整的Microsoft SQL Server 2008在Windows 7操作系统上的安装过程.注意:Microsoft SQL Server 2008与Windows 7操作系统存在一定的兼容性问题,在完成安装之后需要为Microsoft SQL Server 2008安装SP1补丁.下面将详细说明整个安装过程. 安装日志 在Windows7操作系统系,启动Microsoft SQL 2008安装程序后,系统兼容性助手将提示软件存

[MS]Microsoft SQL Server 2008 R2 开发版/企业版/标准版

Microsoft? SQL Server? 2008 R2 是一个功能强大且可靠的数据管理系统,它功能丰富,能保护数据,并且可改善嵌入式应用程序.轻型网站和应用程序以及本地数据存储区的性能. 数据中心版:PTTFM-X467G-P7RH2-3Q6CG-4DMYB(可用,已验证)DDT3B-8W62X-P9JD6-8MX7M-HWK38(待测) 开发版:MC46H-JQR3C-2JRHY-XYRKY-QWPVM (可用,已验证)FTMGC-B2J97-PJ4QG-V84YB-MTXX8(待测)

数据库备份和恢复秩序的关系(周围环境:Microsoft SQL Server 2008 R2)

让我们来看看在备份序列新手 --1.塔建环境(生成测试数据和备份文件) /* 測试环境: Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) */ USE mast

Microsoft SQL Server 2008 R2完全卸载再安装手册

  Microsoft SQL Server 2008 R2安装后,可能一些原因导致程序故障,需要重新安装,但是卸载后,很难再进行安装,基本都会报错,导致程序无法正常安装使用,以下是亲测有效的方法,屡试不爽,以及一些其它可能出现的问题,如参照以下方法仍旧不能解决,建议重新安装系统,再安装数据库,这是最简单最有效的方法,. 第一部分完全卸载Microsoft SQL server 2008 R2 首先进入控制面板:鼠标左键点击左下角windows图标键 2. 进入后选择程序和功能 找到Micros

数据库备份还原顺序关系(环境:Microsoft SQL Server 2008 R2)

让新手们了解一下备份顺序 --1.塔建环境(生成测试数据和备份文件) /* 测试环境: Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) */ USE maste

卸载Microsoft SQL Server 2008 R2 安装程序

在卸载Microsoft SQL Server 2008 R2 安装程序(简体中文)  出现 :"警告 26003.无法卸载 Microsoft SQL Server 2008 R2 安装程序支持文件,因为安装了以下产品:SQL Server 2008 R2 SP1 Database Engine Shared   SQL Server 2008 R2 SP1 Common Files".但是在程序列表中并未找到该程序,在网上找了找资料,可以使用 WMIC(Windows Manage

Microsoft SQL Server 2008 R2 安装卸载

问题 问题1 标题: Microsoft SQL Server 2008 R2 安装程序 ------------------------------ 出现以下错误: Could not open key: UNKNOWN\Components\7ABFE44842C12B390AF18C3B9B1A1EE8\000021599B0090400100000000F01FEC.   Verify that you have sufficient access to that key, or con

Microsoft SQL Server 2008 安装图解(Windows 7)

简介 本文详细记录了一次完整的Microsoft SQL Server 2008在Windows 7操作系统上的安装过程.注意:Microsoft SQL Server 2008与Windows 7操作系统存在一定的兼容性问题,在完成安装之后需要为Microsoft SQL Server 2008安装SP1补丁.下面将详细说明整个安装过程. 安装日志 在Windows7操作系统系,启动Microsoft SQL 2008安装程序后,系统兼容性助手将提示软件存在兼容性问题,在安装完成之后必须安装S