0

0

《MicrosoftSqlserver2008Internals》读书笔记--第六章Indexes:I

php中文网

php中文网

发布时间:2016-06-07 15:59:31

|

1254人浏览过

|

来源于php中文网

原创

《Microsoft Sql server 2008 Internals》索引目录: 《microsoft sql server 2008 internals》读书笔记--目录索引 在第五章主要学习了table的内部存储结构,第七章《Special storage》中将继续深入学习存储机制,那将是本书最难理解的一章。第六章主要介绍in

《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)

Hotpot AI Background Remover
Hotpot AI Background Remover

Hotpot.ai推出的图片背景移除工具

下载

■ 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 plaincopyprint?

select * from sys.dm_db_index_physical_stats(DB_ID('testdb'),null,null,null,null);[python] view plaincopyprint?

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

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

44

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

37

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

22

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

19

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

3

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

268

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

51

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

430

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号