二,SQL Server數據庫結構


1. 數據庫物理存儲結構

  數據庫管理系統體系結構最底層的管理器從原理上講都可以統稱為磁盤空間管理器,所以,數據庫的物理存儲是指數據庫的數據以什么方式存儲在計算機磁盤上,又是怎么在磁盤空間管理器管理下運行的。

1.1 數據文件和文件組

  • 主數據庫文件(Primary Database File):是數據庫的起點,可以指向數據庫中文件的其它部分。每個數據庫都有一個主數據庫文件。文件擴展名一般是 .mdf。、
  • 次數據庫文件(Secondary Database File):有些數據庫可能沒有次數據文件,而有的數據庫則有多個次數據文件。文件擴展名多是 .ndf。
  • 事務日志文件:日志文件包含恢復數據庫所需的所有日志信息。每個數據庫必須至少有一個日志文件,但可以不止一個。推薦的文件擴展名是 .ldf。

  數據庫文件組

  • 為了便於分配和管理,SQL Server允許將多個文件歸納為同一組,並賦予此組一個名稱,這就是文件組。文件組能夠控制各個文件的存放位置,其中的每個文件常建立在不同的硬盤驅動器上,這樣可以減輕單個磁盤驅動器的存儲負載,提高數據庫的存儲效率,從而達到提高系統性能的目的。
  • 在存儲數據時, SQL Server采用按比例填充策略使用文件組內每個文件所提供的存儲空間。例如,如果一個服務器上有4個可供數據庫使用的硬盤,他們提供給數據庫的最大存儲空間分別為100M,200M,300M和100M,我們可以在前面3個硬盤上建立一個數據文件組,包含三個文件,每個硬盤上分配一個文件,在第4個硬盤上建立數據庫的日志文件,當發生數據庫的讀寫操作時,日志數據寫入第4個硬盤,而數據庫數據寫入前3個硬盤。在寫入數據時,SQL Server根據文件組內每個數據文件中剩余的空間大小按比例分配寫入其中的數據量,即1:2:3,這樣不僅保證文件組內每個文件的空間基本上同時用完,而且將一次磁盤操作同時分配給多個磁盤控制器,可以減輕每個磁盤的負載,從而提高寫入速度。

  建立數據庫文件和文件組時,應注意以下兩點:

  • 每個數據文件或文件組只能屬於一個數據庫,每個數據文件也只能成為一個文件組的成員。也就是說,數據文件不能跨文件組使用,數據文件和文件組不能跨數據庫使用。
  • 日志文件是獨立的,它不能作為其他數據文件組的成員。即數據庫內的數據和日志不能存入相同的文件或文件組。

  主文件組和次文件組

  • 主文件組:包含主數據文件和所有沒有被包含在其它文件組里的文件。在創建數據庫時,如果未指定其他數據文件所屬文件組,這些文件將歸屬於主文件組。數據庫的系統表都包含在主文件組里,所以,當主文件組的空間用完后,將無法向系統表中添加新的目錄信息。
  • 次文件組:也稱用戶自定義文件組,包括所有使用數據庫創建語句(CREATE  DATABASES)或數據庫修改語句(ALTER  DATABASES)時使用FILEGROUP關鍵字進行指定的文件。
  • 默認文件組:任何時候,只能有一個文件組是默認文件組。默認情況下,主文件組被認為是默認文件組。

  使用數據文件和文件組的建議:

  • 創建數據庫時,允許數據文件能夠自動增長,但要設置一個上限。否則有可能充滿磁盤。
  • 主文件組要足夠大以容納所有的系統表。否則新的信息就無法添加到系統表,數據庫也就無法追加修改。
  • 建議把頻繁查詢的文件和頻繁修改的文件分放在不同的文件組。
  • 把索引、大型的文本文件、圖象文件放到專門的文件組里。

1.2 數據文件的使用分配

  1. 基本知識

  • 在 SQL Server 中,數據文件存儲的基本單位是頁(Page)。
  • 在 SQL Server 2000 中,頁的大小是 8 KB。這意味着 SQL Server 2000 數據庫每兆字節有 128 頁。
  • 每頁的開始部分是 96 字節的頁首,用於存儲系統信息,如頁的類型、頁的可用空間量、頁對象ID等。
  • 根據頁面所存儲的不同信息,可以將它划分為8種頁類型

  8種頁類型 

  • 數據頁面(Data)

    存儲數據行中除TEXT,nNTEXT和IMAGE列數據以外的數據

  • 文本/圖像頁面(Binary Large Object)

    存儲數據行中的TEXT,nNTEXT和IMAGE列數據

  • 索引頁面(Index)

    存儲索引項

  • 全局分配映射頁面(Global and Shared Global Allocation Map)

    存儲數據文件的區域分配信息

  • 頁的可用空間信息頁面(Page Free Space)

    存儲數據文件中可用的空閑信息頁面

  • 索引分配映射頁面(Index Allocation Map)

    存儲表或索引所使用的區域信息

  • 大容量更改信息頁面(Bulk Changed Map)

    存儲有關自上次執行BACKUP LOG語句后的大容量操作所修改的擴展盤區的信息

  • 差異更改信息頁面(Differential Changed Map)

    存儲有關自上次執行BACKUP DATABASE語句后更改的擴展盤區信息

  2.數據頁面存儲格式

  在SQL Server中,數據文件的頁按順序編號,這個編號稱為頁碼。文件首頁的頁碼時0。眾多數據頁構成一個數據文件,每個數據文件都有一個文件ID。在數據庫中唯一標識的一頁需要同時使用文件ID和頁碼。

  在數據頁上,數據行緊接着頁首按順序放置。在頁尾有一個行偏移表。頁上的每一行在行偏移表中都有一個條目,每個條目記錄對於行的第一字節與頁首的距離。行偏移表中的條目序列與頁中行的序列相反。

  

 

 

   (1)數據頁首

  數據頁包含數據行中除 text、ntext 和 image 數據外的所有數據,頁頭占用每個數據頁的前96個字節,剩余的8096字節用於數據和行偏移數組。

  (2)數據行

  • 緊跟着頁頭的就是存儲表的真正數據行區域。單個數據行的最大長度是8060字節。
  • 數據行不能跨頁存儲(文本和圖像例外)。頁內數據行的多少依賴於表的結構和要存儲的數據。
  • 如果一個表的所有列都是定長,那么該表在每一頁上存儲相同數目的行。
  • 如果一個表里有變長列,那么該表總是在每一頁上存儲盡可能多的行。
  • 數據行越短,每一頁存儲的行數就越多。

  (3)行偏移表

  • 當單行數據長度為最大8060字節時,行偏移數組占用8096-8060=36個字節。
  • 但實際中一個數據行大多不是8060字節,往往比這個小,所以數據行占用的總字節數目和行偏移數組占用的總字節數是系統動態調整,數據行字節越少,偏移數組字節越多,反之,數據行字節越多,偏移數組字節越少,但不能少於36個字節。
  • 每兩個字節構成一個條目塊,每個條目表示頁中相關數據行開始的偏移量。

  注意:行偏移數組表示的是頁中數據行的邏輯順序,不是物理順序。真正的物理順序與聚集索引有關。

  (4)頁面鏈接

  • 每個表或索引視圖的數據行一般都分開存儲在多個 8 KB 數據頁中。如上面所述,每個數據頁都有一個 96 字節的頁頭,其中包含擁有該頁的表的標識符 (ID) 這樣的系統信息,也包含指向下一頁及前面用過的頁的指針。

  

 

 

   3. SQL Server空間使用分配

  SQL Server 2000向表或索引分配空間的基本單位為區域(Extent),一個區域長度為8個連續的頁面,也就是64KB。區域分為以下兩種類型:

  統一區域:區域中的8個頁面只能存儲同一種數據庫對象(對象是指表或索引)。

  混合區域:區域中不同頁面可以存儲不同的數據庫對象。但由於每個頁面只能存儲同一種數據庫對象,所以一個混合區域最多可存儲8種數據庫對象。

  當數據庫對象較少時,可以分配混合區域,供數據庫中不同類型的數據庫對象使用。但當同種數據庫對象所占用的空間達到8個頁面時,可以在將它們轉換為統一區域。

  SQL Server使用以下兩種類型的分配映射頁面記錄區域的分配使用情況

  • 全局分配映射(Global Allocation Map,簡稱GAM)頁面:GAM頁面中的每一位記錄一個區域的分配情況,當位值為1時,說明區域為空閑區域;當位值為0時,表示區域已經被分配使用。由於每個頁面大小為8KB,所以一個GAM頁面能夠覆蓋64000個區域,即4GB。
  • 共享全局分配映射(Shared Global Allocation Map,簡稱SGAM)頁面:SGAM頁面用於記錄有空閑頁面的混合區域。每個SGAM頁面覆蓋64000個區域。當位值為1時,說明區域為混合區域,並且其中有空閑頁面;當位值為0時,說明相應的盤區沒有被用作混合區域,或者它是一個沒有空閑頁可分配的混合區域。

  4. 索引分配映射管理

  SQL Server使用索引分配映射(IAM)頁面管理堆或索引所分配區域的使用情況。每個IAM頁面的頁面頭記錄該IAM頁面所映射區域范圍的起始區域,其映射區中的每一位說明一個區域的使用狀態,其中第一位代表IAM頁面所映射區域范圍內的第一個區域,第二位代表第二個區域等等。當映射區中某位為0時,說明該位所映射區域仍未分配給擁有該IAM頁面的對象使用;當其值為1時,說明該位所映射區域已經分配給擁有該IAM頁面的對象使用。

  每個堆或索引可以有一個或多個IAM頁面記錄分配給該對象區域的使用情況,堆或索引在每個分配區域的數據文件中至少有一個IAM頁面。這些IAM頁面在數據文件中沒有固定位置,它們根據需要進行分配,並隨即定位。一個對象的所有IAM頁面組成一個鏈表,其第一個IAM頁面的位置記錄在sysindexes系統表的FisrtIAM列內.所以,根據FirstIAM列和IAM頁面鏈表就可以查找到一個對象的所有IAM頁面。SQL Server確定某個頁面屬於某個表的唯一方法就是檢查該表的IAM頁。

  5. 頁面自由空間管理

  當一個區域分配給某個數據庫對象時,SQL Server使用PFS(Page Free Space)頁面記錄區域內的單個頁面是否分配使用,以及頁面中的空間使用情況:即全部空閑、1%~50%滿、51%~80%滿、81%~95%滿,還是96%~100%滿。當SQL Server需要分配新的頁面,或者查找有自由空間頁面時,它使用PFS頁面中所記錄的這些信息。 數據庫文件的第二頁(頁面1)是第一個PFS頁,其后每經過8088頁就又是一個PFS頁。

  在已分配的區域內查找不到足夠的空間,它將分配一個新的區域給數據庫對象。

  一個完整數據文件的頁面結構

  • 0----文件頭頁面
  • 1----PFS頁面
  • 2----GAM頁面
  • 3----SGAM頁面‘
  • ......
  • 數據頁面以及其他頁面

1.3 事務日志文件結構

  1. 事務日志

  • SQL Server在內存中建立了一個緩沖區,在檢索數據時,它將數據讀入該緩沖區中,而在修改數據時,它並不是直接修改磁盤中的數據,而是先在緩沖區中建立修改數據副本,之后在頁面刷新時再將它們寫入磁盤。這樣做可以提高數據處理速度,減少磁盤讀寫次數。在緩沖區中被修改后而沒有寫入磁盤的頁面稱作“臟頁”,“臟頁”由SQL Server遲寫進程定期寫入磁盤,這一操作叫做“頁面刷新”。
  • 每當對緩沖區中的數據頁面進行修改時,SQL Server自動在日志緩存中構造該操作的日志記錄。

  日志記錄所記錄的操作類型

  • 每個事務的開始和結束
  • 數據的插入,修改和刪除操作
  • 事務操作的對象
  • 修改前數據的舊值,修改后數據的新值
  • 區域的分配和釋放
  • 表和索引的創建和刪除

  2. 事務日志的物理存儲

  一個數據庫事務日志可以對應一個或多個物理文件,SQL Server  2000 在內部又將每個物理日志文件分成許多個虛擬日志文件。虛擬日志文件沒有固定大小,且物理日志文件所包含的虛擬日志文件數不固定。 虛擬日志文件大小不能由管理員配置或設置,而由SQL Server代碼動態確定。

  事務日志是回繞的日志文件。例如,假設有一個數據庫,它包含一個分成5個虛擬日志文件的物理日志文件。當創建數據庫時,邏輯日志文件從物理日志文件的始端開始。在邏輯日志的末端添加新的日志記錄,邏輯日志就向物理日志末端增長。截斷操作發生時,刪除最小恢復日志序號(MinLSN)之前的虛擬日志內的記錄,這部分日志記錄所占用的空間即可被重復使用。

  

 

 

   當邏輯日志的末端到達物理日志文件的末端時,新的日志記錄繞回物理日志文件的始端,如圖所示。這個循環不斷重復,只要邏輯日志的末端不到達邏輯日志的始端。如果經常截斷舊的日志記錄,使得總能為下一個檢查點創建的所有新日志記錄保留足夠的空間,那么日志永遠不會填滿。 

  

 

 

 2. 數據庫的邏輯組織

  一個數據庫服務器上可以有多個數據庫,這些數據庫可以按功能進行划分,最終存儲管理相應的數據。每個數據庫又有各種不同的邏輯組件。

2.1數據庫架構

  數據庫存儲是按物理方式在磁盤上作為兩個或更多的文件實現。用戶使用數據庫時使用的主要是邏輯組件,例如表、視圖等。

  

 

 

  每個 SQL Server 實例有四個系統數據庫(master、model、tempdb 和 msdb)以及一個或多個用戶數據庫。

  

 

 

2.2 系統數據庫

  

 

 

  (1)master數據庫

  • master數據庫由系統表組成,記錄了安裝以及隨后創建的所有數據庫的信息。包括數據庫所用磁盤空間、文件分配、空間使用率、系統級的配置設置、登錄帳戶密碼、存儲位置等。
  • master數據庫是系統的關鍵,不允許任何人對它進行修改。必須經常保留一份它的當前備份的拷貝。

  (2)tempdb數據庫

  • tempdb數據庫記錄了用戶創建的所有臨時表、臨時數據和臨時的存儲過程。該數據庫是一個全局資源,允許所有可以連接上的SQL服務器訪問。
  • 注意,每次SQL Server重新啟動,該數據庫被重新創建而不是恢復,所以以前用戶創建的任何臨時對象(表、數據、存儲過程等)都將丟失。也就是說,每次SQL Server重啟,tempdb數據庫都是空的。

  (3)model數據庫

  • model數據庫是建立新數據庫的模板。每當創建一個新的數據庫時(比如用企業管理器去創建,或用CREATE  DATABASE創建),SQL Server就會根據model數據庫的內容來形成新數據庫結構的基礎,把后面初始化為空,以准備放數據;同時將系統表復制到剛創建的數據庫中去。
  • 嚴格禁止刪除model數據庫,否則SQL Server系統將無法使用。

  (4)msdb數據庫

  • msdb數據庫是由SQL Server Agent服務使用的數據庫。由於SQL Server Agent主要執行一些事先安排好的任務,所以該數據庫多用於進行復制、作業調度以及管理報警等活動。
  • 如果不使用代理服務功能,我們可以忽略這個數據庫。

2.3 用戶數據庫

  • 在SQL Server中,一個用戶數據庫是由用戶定義的用來永久存儲像表和索引這樣的數據庫對象的磁盤空間構成,這些空間被分配在一個或多個操作系統文件上。
  • 用戶數據庫和系統數據庫一樣,也被划分成許多邏輯頁(每個邏輯頁的大小是8KB),在每個數據庫文件中頁是從0到X連續編號,上限值X是由文件的大小決定的。
  • 通過指定數據庫ID(或數據庫名稱)、文件ID和頁號,可以引用任何一頁。當擴大文件時,新空間被追加到文件的末尾。

  使用CREATE  DATABASE語句創建一個新的用戶數據庫,該數據庫就被賦予一個惟一的數據庫ID,者說dbid,同時在master數據庫中的sysdatabases表中就會插入一個新行。 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM