程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 索引原理(SQL)

索引原理(SQL)

編輯:關於SqlServer

中小企業MIS系統的管理基本上由兩大部份組成,一是前台的可視化操作,二是後台的數據庫管理。網管對前台的管理和維護工作包括保障網絡鏈路通暢、處理MIS終端的突發事件以及對操作員的管理、培訓等,這是網管們日常做得最多、最辛苦的功課;然而MIS系統架構中同等重要的針對數據庫的管理、維護和優化工作,現實中似乎並沒有得到網管朋友的足夠重視,看起來這都是程序員的事,事實上,一個網管如果能在MIS設計期間就數據表的規范化、表索引優化、容量設計、事務處理等諸多方面與程序員進行卓有成效的溝通和協作,那麼日常的前台管理工作將會變得大為輕松,因為在某種意義上,數據庫管理系統就相當於操作系統,在系統中占有同樣重要的位置。


這正是SQL Server等數據庫管理系統和DBaseX、Access等數據庫文件系統的本質區別,所以,對數據庫管理系統操作能力的強弱在某種程度上也折射出了網管的水平——個人認為,稱得上優秀的Admin,至少應該是一個稱職的DBA(數據庫管理員)。
下面以SQL Server(下稱 SQLS)為例,將數據庫管理中難於理解的“索引原理”問題給各位朋友作一個深入淺出的介紹。其他的數據庫管理系統如Oracle、Sybase等,朋友們可以融會貫通,舉一反三。

一、數據表的基本結構
建立數據庫的目的是管理大量數據,而建立索引的目的就是提高數據檢索效率,改善數據庫工作性能,提高數據訪問速度。對於索引,我們要知其然,更要知其所以然,關鍵在於認識索引的工作原理,才能更好的管理索引。
為認識索引工作原理,首先有必要對數據表的基本結構作一次全面的復習。
SQLS當一個新表被創建之時,系統將在磁盤中分配一段以8K為單位的連續空間,當字段的值從內存寫入磁盤時,就在這一既定空間隨機保存,當一個8K用完的時候,SQLS指針會自動分配一個8K的空間。這裡,每個8K空間被稱為一個數據頁(Page),又名頁面或數據頁面,並分配從0-7的頁號,每個文件的第0頁記錄引導信息,叫文件頭(File header);每8個數據頁(64K)的組合形成擴展區(Extent),稱為擴展。全部數據頁的組合形成堆(Heap)。
SQLS規定行不能跨越數據頁,所以,每行記錄的最大數據量只能為8K。這就是char和varchar這兩種字符串類型容量要限制在8K以內的原因,存儲超過8K的數據應使用text類型,實際上,text類型的字段值不能直接錄入和保存,它只是存儲一個指針,指向由若干8K的文本數據頁所組成的擴展區,真正的數據正是放在這些數據頁中。
頁面有空間頁面和數據頁面之分。
當一個擴展區的8個數據頁中既包含了空間頁面又包括了數據或索引頁面時,稱為混合擴展(Mixed Extent),每張表都以混合擴展開始;反之,稱為一致擴展(Uniform Extent),專門保存數據及索引信息。
表被創建之時,SQLS在混合擴展中為其分配至少一個數據頁面,隨著數據量的增長,SQLS可即時在混合擴展中分配出7個頁面,當數據超過8個頁面時,則從一致擴展中分配數據頁面。
空間頁面專門負責數據空間的分配和管理,包括:PFS頁面(Page free space):記錄一個頁面是否已分配、位於混合擴展還是一致擴展以及頁面上還有多少可用空間等信息;GAM頁面(Global allocation map)和SGAM頁面(Secodary global allocation map):用來記錄空閒的擴展或含有空閒頁面的混合擴展的位置。SQLS綜合利用這三種類型的頁面文件在必要時為數據表創建新空間;
數據頁或索引頁則專門保存數據及索引信息,SQLS使用4種類型的數據頁面來管理表或索引:它們是IAM頁、數據頁、文本/圖像頁和索引頁。
在Windows中,我們對文件執行的每一步操作,在磁盤上的物理位置只有系統(system)才知道;SQL Server沿襲了這種工作方式,在插入數據的過程中,不但每個字段值在數據頁面中的保存位置是隨機的,而且每個數據頁面在“堆”中的排列位置也只有系統(system)才知道。
這是為什麼呢?眾所周知,OS之所以能管理DISK,是因為在系統啟動時首先加載了文件分配表:FAT(File Allocation Table),正是由它管理文件系統並記錄對文件的一切操作,系統才得以正常運行;同理,作為管理系統級的SQL Server,也有這樣一張類似FAT的表存在,它就是索引分布映像頁:IAM(Index Allocation Map)。
IAM的存在,使SQLS對數據表的物理管理有了可能。
IAM頁從混合擴展中分配,記錄了8個初始頁面的位置和該擴展區的位置,每個IAM頁面能管理512,000個數據頁面,如果數據量太大,SQLS也可以增加更多的IAM頁,可以位於文件的任何位置。第一個IAM頁被稱為FirstIAM,其中記錄了以後的IAM頁的位置。
數據頁和文本/圖像頁互反,前者保存非文本/圖像類型的數據,因為它們都不超過8K的容量,後者則只保存超過8K容量的文本或圖像類型數據。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved