찾다
데이터 베이스MySQL 튜토리얼《MicrosoftSqlserver2008Internals》读书笔记--第六章Indexes:I

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

■ 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으로 문의하세요.
Docker에서 MySQL 메모리 사용을 줄입니다Docker에서 MySQL 메모리 사용을 줄입니다Mar 04, 2025 pm 03:52 PM

이 기사는 Docker에서 MySQL 메모리 사용을 최적화합니다. 모니터링 기술 (Docker Stats, Performance Schema, 외부 도구) 및 구성 전략에 대해 설명합니다. 여기에는 Docker 메모리 제한, 스와핑 및 CGroups와 함께 포함됩니다

MySQL의 문제를 해결하는 방법 공유 라이브러리를 열 수 없습니다.MySQL의 문제를 해결하는 방법 공유 라이브러리를 열 수 없습니다.Mar 04, 2025 pm 04:01 PM

이 기사에서는 MySQL의 "공유 라이브러리를 열 수 없음"오류를 다룹니다. 이 문제는 MySQL이 필요한 공유 라이브러리 (.so/.dll 파일)를 찾을 수 없음에서 비롯됩니다. 솔루션은 시스템 패키지 M을 통한 라이브러리 설치 확인과 관련이 있습니다.

Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까?Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까?Mar 19, 2025 pm 03:51 PM

이 기사는 MySQL의 Alter Table 문을 사용하여 열 추가/드롭 테이블/열 변경 및 열 데이터 유형 변경을 포함하여 테이블을 수정하는 것에 대해 설명합니다.

Linux에서 MySQL을 실행합니다 (Phpmyadmin이있는 Podman 컨테이너가 포함되지 않음)Linux에서 MySQL을 실행합니다 (Phpmyadmin이있는 Podman 컨테이너가 포함되지 않음)Mar 04, 2025 pm 03:54 PM

이 기사는 Linux에 MySQL을 직접 설치하는 것과 Phpmyadmin이없는 Podman 컨테이너 사용을 비교합니다. 각 방법에 대한 설치 단계에 대해 자세히 설명하면서 Podman의 격리, 이식성 및 재현성의 장점을 강조하지만 또한

sqlite 란 무엇입니까? 포괄적 인 개요sqlite 란 무엇입니까? 포괄적 인 개요Mar 04, 2025 pm 03:55 PM

이 기사는 자체 포함 된 서버리스 관계형 데이터베이스 인 SQLITE에 대한 포괄적 인 개요를 제공합니다. SQLITE의 장점 (단순성, 이식성, 사용 용이성) 및 단점 (동시성 제한, 확장 성 문제)에 대해 자세히 설명합니다. 기음

MacOS에서 여러 MySQL 버전을 실행 : 단계별 가이드MacOS에서 여러 MySQL 버전을 실행 : 단계별 가이드Mar 04, 2025 pm 03:49 PM

이 안내서는 Homebrew를 사용하여 MacOS에 여러 MySQL 버전을 설치하고 관리하는 것을 보여줍니다. 홈 브루를 사용하여 설치를 분리하여 갈등을 방지하는 것을 강조합니다. 이 기사에는 설치, 서비스 시작/정지 서비스 및 Best Pra에 대해 자세히 설명합니다

MySQL 연결에 대한 SSL/TLS 암호화를 어떻게 구성합니까?MySQL 연결에 대한 SSL/TLS 암호화를 어떻게 구성합니까?Mar 18, 2025 pm 12:01 PM

기사는 인증서 생성 및 확인을 포함하여 MySQL에 대한 SSL/TLS 암호화 구성에 대해 설명합니다. 주요 문제는 자체 서명 인증서의 보안 영향을 사용하는 것입니다. [문자 수 : 159]

인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)?인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)?Mar 21, 2025 pm 06:28 PM

기사는 MySQL Workbench 및 Phpmyadmin과 같은 인기있는 MySQL GUI 도구에 대해 논의하여 초보자 및 고급 사용자를위한 기능과 적합성을 비교합니다. [159 자].

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음