Rumah pangkalan data tutorial mysql SQL Server存储引擎

SQL Server存储引擎

Jun 07, 2016 pm 05:42 PM
Melintasi

一、遍历索引树的每个节点都是一个页面。索引树有三种类型的节点:根节点、中间节点、叶子节点。(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” 博客,请务必保留此出处

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Java bagaimana untuk menggelung melalui folder dan mendapatkan semua nama fail Java bagaimana untuk menggelung melalui folder dan mendapatkan semua nama fail Mar 29, 2024 pm 01:24 PM

Java ialah bahasa pengaturcaraan yang popular dengan keupayaan pengendalian fail yang berkuasa. Di Java, melintasi folder dan mendapatkan semua nama fail adalah operasi biasa, yang boleh membantu kami mencari dan memproses fail dengan cepat dalam direktori tertentu. Artikel ini akan memperkenalkan cara melaksanakan kaedah melintasi folder dan mendapatkan semua nama fail dalam Java, dan memberikan contoh kod khusus. 1. Gunakan kaedah rekursif untuk melintasi folder Kita boleh menggunakan kaedah rekursif untuk melintasi folder.

Contoh penggunaan fungsi PHP glob(): melintasi semua fail dalam folder tertentu Contoh penggunaan fungsi PHP glob(): melintasi semua fail dalam folder tertentu Jun 27, 2023 am 09:16 AM

Contoh penggunaan fungsi PHPglob(): Melintasi semua fail dalam folder tertentu Dalam pembangunan PHP, selalunya perlu untuk melintasi semua fail dalam folder tertentu untuk melaksanakan operasi kelompok atau membaca fail. Fungsi glob() PHP digunakan untuk mencapai keperluan ini. Fungsi glob() boleh mendapatkan maklumat laluan semua fail yang memenuhi syarat dalam folder yang ditentukan dengan menentukan corak padanan kad bebas. Dalam artikel ini, kami akan menunjukkan cara menggunakan fungsi glob() untuk beralih melalui semua fail dalam folder tertentu

Perbandingan Mendalam Java Iterator dan Iterable: Analisis Kebaikan dan Keburukan Perbandingan Mendalam Java Iterator dan Iterable: Analisis Kebaikan dan Keburukan Feb 19, 2024 pm 04:20 PM

Perbezaan konsep: Iterator: Iterator ialah antara muka yang mewakili iterator yang memperoleh nilai daripada koleksi. Ia menyediakan kaedah seperti MoveNext(), Current() dan Reset(), membolehkan anda melintasi elemen dalam koleksi dan beroperasi pada elemen semasa. Boleh lelar: Boleh lelar juga ialah antara muka, mewakili objek boleh lelar. Ia menyediakan kaedah Iterator(), yang mengembalikan objek Iterator untuk memudahkan melintasi elemen dalam koleksi. Penggunaan: Iterator: Untuk menggunakan Iterator, anda perlu mendapatkan objek Iterator dahulu, dan kemudian panggil kaedah MoveNext() untuk beralih ke yang seterusnya

Cara menggunakan modul os untuk melintasi fail dalam direktori dalam Python 3.x Cara menggunakan modul os untuk melintasi fail dalam direktori dalam Python 3.x Jul 29, 2023 pm 02:57 PM

Cara menggunakan modul os untuk melintasi fail dalam direktori dalam Python3.x Dalam Python, kita boleh menggunakan modul os untuk mengendalikan fail dan direktori. Modul os ialah modul penting dalam perpustakaan standard Python, menyediakan banyak fungsi berkaitan sistem pengendalian. Dalam artikel ini, kami akan menerangkan cara menggunakan modul os untuk mengulangi semua fail dalam direktori. Pertama, kita perlu mengimport modul os: importos Seterusnya, kita boleh menggunakan fungsi os.walk() untuk menjalankan direktori.

Bagaimana untuk melaksanakan traversal pokok binari menggunakan Python Bagaimana untuk melaksanakan traversal pokok binari menggunakan Python Jun 09, 2023 pm 09:12 PM

Sebagai struktur data yang biasa digunakan, pokok binari sering digunakan untuk menyimpan data, mencari dan mengisih. Melintasi pokok binari adalah salah satu operasi yang sangat biasa. Sebagai bahasa pengaturcaraan yang mudah dan mudah digunakan, Python mempunyai banyak kaedah untuk melaksanakan traversal pokok binari. Artikel ini akan memperkenalkan cara menggunakan Python untuk melaksanakan traversal prapesanan, tertib dan pasca pesanan bagi pokok binari. Asas Pokok Binari Sebelum mempelajari cara melintasi pokok binari, kita perlu memahami konsep asas pokok binari. Pokok binari terdiri daripada nod, setiap nod mempunyai nilai dan dua nod anak (nod anak kiri dan nod anak kanan

Memasukkan dan melintasi senarai terpaut secara rekursif dalam C++ Memasukkan dan melintasi senarai terpaut secara rekursif dalam C++ Sep 10, 2023 am 09:21 AM

Kami mendapat nilai integer yang digunakan untuk membentuk senarai terpaut. Tugasnya adalah untuk memasukkan dahulu dan kemudian melintasi senarai pautan tunggal menggunakan kaedah rekursif. Tambah nod secara rekursif pada penghujung jika kepala adalah NULL → tambah nod ke kepala sebaliknya tambah pada kepala (kepala → seterusnya) secara rekursif melintasi nod jika kepala adalah NULL → keluar jika tidak cetak (kepala → seterusnya) Contoh input −1-2-7-9 -10 output outputstrong>− senarai terpaut: 1→2→7→9→10→NULL input−12-21-17-94-18 output− senarai terpaut: 12→21→17→94→18→NULL digunakan dalam atur cara berikut Kaedahnya adalah seperti berikut Dalam kaedah ini, kami akan menggunakan fungsi untuk menambah nod dan melintasi senarai pautan tunggal dan lulus

Java Iterator dan Iterable: Kunci kepada traversal koleksi, dinyahmistifikasikan Java Iterator dan Iterable: Kunci kepada traversal koleksi, dinyahmistifikasikan Feb 20, 2024 am 10:27 AM

Pengenalan kepada IteratorIterator ialah antara muka dalam Java untuk merentasi koleksi. Ia menyediakan satu set kaedah yang membolehkan anda mengakses elemen dalam koleksi secara berurutan. Anda boleh menggunakan Iterator untuk mengulangi jenis koleksi seperti Senarai, Set dan Peta. Kod demo: Listlist=newArrayList();list.add("one");list.add("dua");list.add("tiga");Iteratoriterator=list.iterator();while(iter

Java Iterator lwn. Iterable: Membuka Kunci Kuasa Koleksi Java Java Iterator lwn. Iterable: Membuka Kunci Kuasa Koleksi Java Feb 19, 2024 pm 07:00 PM

Di Java, koleksi ialah koleksi elemen yang menyediakan antara muka bersatu dan kaedah untuk menyimpan, mendapatkan dan mengendalikan elemen ini. Iterator dan Iterable ialah dua antara muka Java penting yang menyediakan mekanisme biasa untuk merentasi elemen koleksi. Antara muka Iterator mentakrifkan kaedah hasNext() dan next() untuk merentasi koleksi. Kaedah hasNext() digunakan untuk menyemak sama ada terdapat sebarang elemen yang tidak dilalui dalam koleksi, dan kaedah next() digunakan untuk mengembalikan elemen semasa dan mengalihkannya ke elemen seterusnya. Antara muka Iterable mentakrifkan kaedah iterator(), yang mengembalikan objek Iterator untuk merentasi elemen dalam koleksi.

See all articles