데이터 베이스 MySQL 튜토리얼 SQL Server存储引擎

SQL Server存储引擎

Jun 07, 2016 pm 05:42 PM
횡단

一、遍历索引树的每个节点都是一个页面。索引树有三种类型的节点:根节点、中间节点、叶子节点。(1)根节点与中间节点一样,只包含下一层节点的入口值与入口指针

一、遍历

索引树的每个节点都是一个页面。

索引树有三种类型的节点:根节点、中间节点、叶子节点。

(1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点;

(2) 叶子节点包含要遍历的数据,服务器空间,对聚集索引而言数据就是表中数据行,对非聚集索引数据是指索引列值和行书签。


索引的遍历总是从根节点开始,即先根遍历,分为两种:索引扫描和索引查找。

(1) 索引扫描,是指从索引树的根节点开始,对叶子节点逐个扫描,直至命中所有满足查找条件的数据;

(2) 索引查找,是指从索引树的根节点开始,按查找值在索引节点中根据路由信息跳转,直至叶子节点以命中数据。


B+树的深度通常小于等于3,计算如下:

以聚集索引为例,简单计算如下:10个INT列宽度总和为40B,假设聚集索引树每一层为二叉,共三层,即2^0+2^1+2^2=1*(1-2^3)/(1-2)=7个页面,4个叶子节点,每个页面8060K可存储8060000/40=201500行,乘以4=806000行,如果是三叉、四叉,那么三层可存储上千万至亿行的数据,当然在数据量达到这个等级时,通常我们会选择表分区,那么B树深度就更不会突破三层了。

所以索引查找的效率是很高的,在查询中应该努力构造索引查找,避免索引扫描。


二、插入

2.1、页空间充足

在已存在数据的表上,创建或重建索引时,可指定填充因子,即在索引树的每个节点上预留一定的空间,供表中后续增加的数据使用。但如果在创建表的时候就创建了索引,并指定了填充因子,这时的填充因子是无用的,数据库系统不会刻意去保留页面的空间。


索引页面有剩余空间的情况如下图:

 SQL Server存储引擎

图1

参考图1,此时向索引树中插入一条索引键值为31的记录,步骤如下:

(1)执行索引键值=31的查找操作,确定该新记录应该插入到叶子节点L2中。

(2)检查L2上是否有足够的空间来存放当前记录,这里假设有足够的空间;

(3)将记录45向后移动,插入索引键值为31的新记录。插入之后,10、30、31、45还是顺序的,香港服务器,如下图:


 SQL Server存储引擎

图2

2.2、页空间不足

参加图2,此时再插入一条索引键值为32的记录,步骤如下:

(1)执行索引键值=32的查找操作,确定该新记录应该插入到叶子节点L2中;

(2)检查L2上是否有足够的空间来存放当前记录,这时发现没有足够的页空间,香港服务器,此时需要进行页面分裂;

(3)向数据库系统申请一个新的页面L4,将L2的一半数据移到L4中,并重新链接叶子的左右节点,如下图:


 SQL Server存储引擎

图3

(4)此时,上层节点也需要生成一个新的叶子节点的指针。这里的上层节点即根节点,如果上层节点没有剩余空间的话,同样也需要进行分裂,这里有剩余空间,如下图:


 SQL Server存储引擎

图4

(5)因为当前记录的键值范围位于页分裂的后一半中,将索引键值为32的新记录插入到L4中,如果键值范围位于前一半,则插入到L2中。如果L4的空间不够存放键值为32的新记录,则L4会继续进行页分裂,这里假设空间足够,插入结束,如下图:


 SQL Server存储引擎

图5

三、删除

3.1、删除叶子节点中的记录

参考图5,删除索引键值为32的记录,步骤如下:

(1)执行索引键值=32的查找操作,确定该记录在L4中;

(2)将索引键值=32的记录标记为虚影,但并不立即释放空间,虚影记录可用于事务回滚、多版本等;

(3)如果此时L4上的虚影记录空间被申请使用,虚影记录就会被擦除;

(4)如果数据页面最后一条记录也被删除,数据页面会被回收;


3.2、删除非叶子节点中的记录

(1)索引节点中的指针被删除时并不是虚影记录,但同样也不释放空间,直到有新的指针插入时,才会进行空间压缩;

(2)堆表中数据行被删除后,页空间不会被回收,即使是空闲分页也还是标识为分配状态,无法被其他对象使用;


注:从理论上讲,在兄弟节点页面空闲空间都小于50%时,应该将兄弟节点合并,即分裂的逆操作,但这样可能带来的后果是更频繁的页面合并、分裂,成本更大,所以在数据库系统中通常不进行页面合并操作,除非rebuild/reorganize索引。


四、更新

4.1、覆盖更新

如果更新操作能够在页内进行原位键值替换,那么就进行覆盖更新。


4.2、非覆盖更新

无法进行覆盖更新时,更新操作被分解为删除和插入操作。


如果非覆盖更新过程中,新的记录比较长,则会在页面分裂的过程中会带来数据行的移动:

(1)聚集索引的移动对非聚集索引没有影响,因为非聚集索引中存储的是聚集索引的键值,分裂并不会改变键值;

(2)堆表中的数据页分裂,会在原记录处留下一个前转指针,以告诉非聚集索引去哪里找新的记录;

所以数据行的移动对非聚集索引都不会带来维护的成本,非聚集索引的维护成本来自书签的变化:

(1)聚集索引的键值发生变化或被删除;

(2)堆表中的数据行被删除。


本文出自 “SQL Server DBA” 博客,请务必保留此出处

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 폴더를 반복하고 모든 파일 이름을 얻는 방법 Java 폴더를 반복하고 모든 파일 이름을 얻는 방법 Mar 29, 2024 pm 01:24 PM

Java는 강력한 파일 처리 기능을 갖춘 널리 사용되는 프로그래밍 언어입니다. Java에서는 폴더를 탐색하고 모든 파일 이름을 가져오는 것이 일반적인 작업이므로 특정 디렉터리에서 파일을 빠르게 찾고 처리하는 데 도움이 될 수 있습니다. 이 기사에서는 폴더를 탐색하여 모든 파일 이름을 Java로 가져오는 방법을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 재귀적 방법을 사용하여 폴더를 순회할 수 있습니다. 재귀적 방법은 폴더를 효과적으로 순회할 수 있는 자체 호출 방법입니다.

PHP glob() 함수 사용 예: 지정된 폴더의 모든 파일을 탐색합니다. PHP glob() 함수 사용 예: 지정된 폴더의 모든 파일을 탐색합니다. Jun 27, 2023 am 09:16 AM

PHPglob() 함수 사용 예: 지정된 폴더의 모든 파일 순회 PHP 개발에서는 일괄 작업이나 파일 읽기를 구현하기 위해 지정된 폴더의 모든 파일을 순회해야 하는 경우가 많습니다. 이 요구 사항을 충족하기 위해 PHP의 glob() 함수가 사용됩니다. glob() 함수는 와일드카드 일치 패턴을 지정하여 지정된 폴더에서 조건을 만족하는 모든 파일의 경로 정보를 얻을 수 있습니다. 이 기사에서는 glob() 함수를 사용하여 지정된 폴더의 모든 파일을 반복하는 방법을 보여줍니다.

Java Iterator와 Iterable의 심층 비교: 장단점 분석 Java Iterator와 Iterable의 심층 비교: 장단점 분석 Feb 19, 2024 pm 04:20 PM

개념적 차이점: Iterator: Iterator는 컬렉션에서 값을 얻는 반복자를 나타내는 인터페이스입니다. MoveNext(), Current() 및 Reset()과 같은 메서드를 제공하여 컬렉션의 요소를 순회하고 현재 요소에 대해 작업을 수행할 수 있습니다. Iterable: Iterable은 반복 가능한 객체를 나타내는 인터페이스이기도 합니다. 컬렉션의 요소 탐색을 용이하게 하기 위해 Iterator 객체를 반환하는 Iterator() 메서드를 제공합니다. 사용법: Iterator: Iterator를 사용하려면 먼저 Iterator 객체를 얻은 후 MoveNext() 메서드를 호출하여 다음 객체로 이동해야 합니다.

Python 3.x에서 os 모듈을 사용하여 디렉터리의 파일을 탐색하는 방법 Python 3.x에서 os 모듈을 사용하여 디렉터리의 파일을 탐색하는 방법 Jul 29, 2023 pm 02:57 PM

Python3.x에서 os 모듈을 사용하여 디렉터리의 파일을 탐색하는 방법 Python에서는 os 모듈을 사용하여 파일 및 디렉터리 작업을 수행할 수 있습니다. os 모듈은 Python 표준 라이브러리의 중요한 모듈로, 많은 운영 체제 관련 기능을 제공합니다. 이 기사에서는 os 모듈을 사용하여 디렉토리의 모든 파일을 반복하는 방법을 설명합니다. 먼저 os 모듈을 가져와야 합니다. importos 다음으로 os.walk() 함수를 사용하여 디렉터리를 탐색할 수 있습니다.

Python을 사용하여 이진 트리 탐색을 구현하는 방법 Python을 사용하여 이진 트리 탐색을 구현하는 방법 Jun 09, 2023 pm 09:12 PM

일반적으로 사용되는 데이터 구조로서 이진 트리는 데이터 저장, 검색 및 정렬에 자주 사용됩니다. 이진 트리 탐색은 매우 일반적인 작업 중 하나입니다. 간단하고 사용하기 쉬운 프로그래밍 언어인 Python에는 이진 트리 탐색을 구현하는 다양한 방법이 있습니다. 이 기사에서는 Python을 사용하여 이진 트리의 선순, 순순, 후순 순회를 구현하는 방법을 소개합니다. 이진 트리의 기초 이진 트리를 순회하는 방법을 배우기 전에 이진 트리의 기본 개념을 이해해야 합니다. 이진 트리는 노드로 구성되며 각 노드에는 값과 두 개의 자식 노드(왼쪽 자식 노드와 오른쪽 자식 노드)가 있습니다.

C++에서 연결 리스트의 재귀 삽입 및 순회 C++에서 연결 리스트의 재귀 삽입 및 순회 Sep 10, 2023 am 09:21 AM

연결된 목록을 형성하는 데 사용되는 정수 값을 얻습니다. 작업은 먼저 재귀적 방법을 사용하여 단일 연결 목록을 삽입한 다음 순회하는 것입니다. head가 NULL이면 끝에 노드를 재귀적으로 추가 → head에 노드 추가 그렇지 않으면 head에 추가(head → next) head가 NULL이면 노드를 재귀적으로 순회 → 그렇지 않으면 종료(head → next) 입력 예 −1-2-7-9 -10 출력 출력강>− 연결 리스트: 1→2→7→9→10→NULL 입력−12-21-17-94-18 출력− 연결 리스트: 12→21→17→94→18→NULL 에서 사용 다음 프로그램 방법은 다음과 같습니다. 이 방법에서는 함수를 사용하여 노드를 추가하고 단일 연결 목록을 순회하고 전달합니다.

Java Iterator 및 Iterable: 설명된 컬렉션 탐색의 핵심 Java Iterator 및 Iterable: 설명된 컬렉션 탐색의 핵심 Feb 20, 2024 am 10:27 AM

Iterator 소개 Iterator는 컬렉션 탐색을 위한 Java의 인터페이스입니다. 컬렉션의 요소에 순차적으로 액세스할 수 있는 메서드 집합을 제공합니다. Iterator를 사용하여 List, Set, Map과 같은 컬렉션 유형을 반복할 수 있습니다. 데모 코드: Listlist=newArrayList();list.add("one");list.add("two");list.add("two");Iteratoriterator=list.iterator();while(iter

Java Iterator와 Iterable: Java 컬렉션의 힘 활용 Java Iterator와 Iterable: Java 컬렉션의 힘 활용 Feb 19, 2024 pm 07:00 PM

Java에서 컬렉션은 이러한 요소를 저장, 검색 및 작동하기 위한 통합 인터페이스와 메서드를 제공하는 요소의 컬렉션입니다. Iterator 및 Iterable은 컬렉션 요소 순회를 위한 공통 메커니즘을 제공하는 두 가지 중요한 Java 인터페이스입니다. Iterator 인터페이스는 컬렉션 순회를 위한 hasNext() 및 next() 메소드를 정의합니다. hasNext() 메소드는 컬렉션에 탐색되지 않은 요소가 있는지 확인하는 데 사용되며, next() 메소드는 현재 요소를 반환하고 다음 요소로 이동하는 데 사용됩니다. Iterable 인터페이스는 컬렉션의 요소를 순회하기 위해 Iterator 객체를 반환하는 iterator() 메서드를 정의합니다.

See all articles