- 達夢數據庫應用基礎(第二版)
- 張海粟 朱明東 王龍 戴劍偉 張守帥等編著
- 3907字
- 2022-05-06 19:17:13
1.2.2 邏輯存儲結構
達夢數據庫的邏輯存儲結構描述了數據庫內部數據的組織和管理方式。達夢數據庫為數據庫中的所有對象分配邏輯空間,并存放在數據文件中。在達夢數據庫內部,所有的數據文件組合在一起被劃分到一個或多個表空間中,所有的數據庫內部對象都存放在這些表空間中。同時,表空間被進一步劃分為段、簇和頁(也稱為塊)。這種細分可以使達夢數據庫更加高效地控制磁盤空間的利用率。圖1-3顯示了邏輯存儲結構之間的關系。
可以看出,在DM8中存儲的層次結構可以表述為:系統由一個或多個表空間組成;每個表空間都由一個或多個數據文件組成;每個數據文件都由一個或多個簇組成;段是簇的上級邏輯單元,一個段可以跨多個數據文件;簇由磁盤上連續的頁組成,一個簇總是在一個數據文件中;頁是數據庫中最小的分配單元,也是數據庫中使用的最小的I/O單元。
1.表空間
在達夢數據庫中,表空間由一個或多個數據文件組成。達夢數據庫中的所有對象在邏輯上都存放在表空間中,而在物理上都存儲在所屬表空間的數據文件中。
在創建達夢數據庫時,會自動創建 5 個表空間:SYSTEM 表空間、ROLL 表空間、MAIN表空間、TEMP表空間和HMAIN表空間。

圖1-3 邏輯存儲結構關系示意圖
(1)SYSTEM表空間存放了有關達夢數據庫的字典信息。
(2)ROLL表空間完全由達夢數據庫自動維護,用戶無須干預。該表空間用來存放事務運行過程中執行DML 操作之前的值,從而為訪問該表空間的其他用戶提供表空間數據的讀一致性視圖。
(3)MAIN 表空間在初始化達夢數據庫的時候,會自動創建一個大小為128MB的數據文件MAIN.DBF。在創建用戶時,如果沒有指定默認表空間,則系統自動指定MAIN表空間為用戶默認表空間。
(4)TEMP表空間完全由達夢數據庫自動維護。當用戶的SQL語句需要利用磁盤空間來完成某個操作時,達夢數據庫會從 TEMP 表空間中分配臨時段,如創建索引、無法在內存中完成的排序操作、SQL語句中間結果集及用戶創建的臨時表等都會用到TEMP表空間。
(5)HMAIN表空間屬于HTS表空間,完全由達夢數據庫自動維護,用戶無須干涉。用戶在創建 HFS 表空間時,在未指定 HTS 表空間的情況下,HMAIN 表空間充當默認HTS表空間。
每個用戶都有一個默認的表空間。SYSSSO、SYSAUDITOR系統用戶默認的表空間是SYSTEM表空間,SYSDBA用戶默認的表空間為MAIN表空間,新創建的用戶如果沒有指定默認的表空間,則系統自動指定MAIN表空間為用戶默認的表空間。用戶在創建表的時候,當指定了存儲表空間A,但和當前用戶的默認表空間B不一致時,表存儲在用戶指定的表空間 A 中,并且在默認情況下,在這張表上建立的索引也將存儲在表空間 A 中,但是用戶默認的表空間是不變的,仍為表空間B。在一般情況下,建議用戶自己創建一個表空間來存放業務數據,或者將數據存放在用戶默認的表空間MAIN表空間中,而不是將數據存放在SYSTEM表空間中。
2.頁
數據頁(也稱為數據塊)是達夢數據庫中最小的數據存儲單元。頁的大小對應物理存儲空間上特定數量的存儲字節,在達夢數據庫中,頁的大小可以為 4KB、8KB、16KB 或32KB,用戶在創建數據庫時可以指定頁的大小,默認大小為8KB。一旦創建好了數據庫,則在該數據庫的整個生命周期內,頁的大小都不能改變。圖1-4顯示了達夢數據庫頁的典型格式。

圖1-4 達夢數據庫頁的典型格式
頁頭控制信息包含頁類型、頁地址等信息。頁的中部存放了數據,為了更好地利用數據頁,在數據頁的尾部專門留出一部分空間用于存放行偏移數組。行偏移數組用于標識頁上的空間占用情況,以便管理數據頁自身的空間。
在絕大多數情況下,用戶無須干預達夢數據庫對數據頁的管理。但是,達夢數據庫還是提供了選項供用戶選擇,可以在某些情況下為用戶提供更佳的數據處理性能。
FILLFACTOR是達夢數據庫提供的一個與性能有關的數據頁級存儲參數,它指定一個數據頁在初始化后插入數據時可以使用空間的最大百分比(100),該值在創建表/索引時可以指定。
設置FILLFACTOR參數的值,是為了指定數據頁中可用空間百分比(FILLFACTOR)和可擴展空間百分比(100-FILLFACTOR)。可用空間用來執行更多的 INSERT 操作;可擴展空間用來為數據頁保留一定的空間,以避免在今后的更新操作中增加列或修改變長列的長度時,引起數據頁的頻繁分裂。當插入的數據占據的數據頁空間百分比小于FILLFACTOR時,允許數據插入該頁;否則,將當前數據頁中的數據分為兩部分,一部分保留在當前數據頁中,另一部分存入一個新數據頁中。
對于DBA來說,在使用FILLFACTOR時應該在空間和性能之間進行權衡。為了充分利用空間,用戶可以設置一個很大的FILLFACTOR值,如100,但是這可能會導致在后續更新數據時頻繁引起數據頁分裂,而導致需要大量的I/O操作。為了提高更新數據的性能,可以設置一個相對較小(但不是過小)的FILLFACTOR值,使得后續在執行更新操作時,可以盡量避免數據頁分裂,提升I/O性能,但這是以犧牲空間利用率換取的性能提高。
3.簇
簇是數據頁的上級邏輯單元,由同一個數據文件中16個或32個連續的數據頁組成。在達夢數據庫中,簇的大小由用戶在創建數據庫時指定,默認大小為16。假定某個數據文件大小為 32MB,頁大小為 8KB,則共有 32MB/8KB/16=256 個簇,每個簇的大小均為8KB×16=128KB。和數據頁的大小一樣,一旦創建好數據庫,此后該數據庫簇的大小就不能改變了。
(1)分配數據簇。
當創建一個表/索引的時候,達夢數據庫為表/索引的數據段分配至少一個簇,同時數據庫會自動生成對應數量的空閑數據頁,供后續操作使用。如果初始分配的簇中所有數據頁都已經用完,或者新插入/更新數據需要更多的空間,達夢數據庫將自動分配新的簇。在默認情況下,達夢數據庫在創建表/索引時,初始分配1個簇,當初始分配的空間用完后,達夢數據庫會自動擴展。
達夢數據庫的表空間在為新的簇分配空閑空間時,首先在表空間中按文件從小到大的順序在各個數據文件中查找可用的空閑簇,找到后進行分配;如果各數據文件中都沒有空閑簇,則在各數據文件中查找足夠的空閑空間,將需要的空間先進行格式化,然后進行分配;如果各數據文件的空閑空間也不夠,則選擇一個數據文件進行擴展。
(2)釋放數據簇。
對于用戶數據表空間,用戶在將一個數據段對應的表/索引對象 DROP 之前,該表對應的數據段會保留至少1個簇不被回收到表空間中。在刪除表/索引對象中的記錄時,達夢數據庫通過修改數據文件中的位圖來釋放簇,釋放后的簇被視為空閑簇,可以供其他對象使用。當用戶刪除了表中的所有記錄時,達夢數據庫仍然會為該表保留1個或2個簇供后續使用。若用戶使用DROP 語句來刪除表/索引對象,則此表/索引對應的段及段中包含的簇全部收回,并供存儲于此表空間中的其他模式對象使用。
對于TEMP表空間,達夢數據庫會自動釋放在執行SQL過程中產生的臨時段,并將屬于此臨時段的簇空間還給TEMP表空間。需要注意的是,TEMP表空間文件在磁盤中所占大小并不會因此而縮減,用戶可以通過系統函數SF_RESET_TEMP_TS來進行磁盤空間的清理。
對于ROLL表空間,達夢數據庫將定期檢查回滾段,并確定是否需要從回滾段中釋放1個或多個簇。
4.段
段是簇的上級邏輯分區單元,段由一組簇組成。在同一個表空間中,段可以包含來自不同文件的簇,即一個段可以跨越不同的文件,而一個簇及該簇所包含的數據頁則只能來自同一個文件,是連續的16個或32個數據頁。由于簇的數量是按需分配的,因此數據段中的不同簇在磁盤上不一定連續。
(1)數據段。
段可以被定義成特定對象的數據結構,如表數據段或索引數據段。表中的數據以表數據段結構存儲,索引中的數據以索引數據段結構存儲。達夢數據庫以簇為單位給每個數據段分配空間,在數據段的簇空間用完后,達夢數據庫會給該段重新分配簇,段的分配和釋放完全由達夢數據庫自動完成,可以在創建表/索引時設置存儲參數來決定數據段的簇如何分配。
當用戶使用CREATE語句創建表/索引時,達夢數據庫會創建相應的數據段。表/索引的存儲參數用來決定對應數據段的簇如何分配,這些參數將影響與對象相關的數據段的存儲與訪問效率。對于分區表,每個分區使用單獨的數據段來容納所有數據;對于分區表上的非分區索引,使用一個索引數據段來容納所有數據;而對于分區表上的分區索引,每個分區使用一個單獨的索引數據段來容納所有數據。表的數據段及與其相關的索引段不一定要存儲在同一個表空間中,用戶可以在創建表/索引時,指定不同的表空間存儲參數。
(2)臨時段。
在達夢數據庫中,所有的臨時段都創建在 TEMP 表空間中。這樣可以分流磁盤設備的I/O,也可以減少由于在SYSTEM表空間或其他表空間中頻繁創建臨時數據段而造成的碎片。
在處理一個查詢操作時,通常需要為 SQL 語句的解析與執行的中間結果準備臨時空間。達夢數據庫會自動地分配臨時段的磁盤空間。例如,達夢數據庫在進行排序操作時就可能需要使用臨時段,當排序操作可以在內存中執行,或者設法利用索引就可以執行時,就不必創建臨時段了。對于TEMP表空間及其索引,達夢數據庫也會為它們分配臨時段。臨時段的分配和釋放完全由系統自動控制,用戶不能手動進行干預。
(3)回滾段。
達夢數據庫在ROLL表空間的回滾段中保存了用于恢復數據庫操作的信息。對于未提交事務,當執行回滾語句時,回滾記錄被用來進行回滾變更。在數據庫恢復階段,回滾記錄被用來進行任何未提交變更的回滾。在多個并發事務運行期間,回滾段還為用戶提供數據讀一致性,所有正在讀取受影響行的用戶將不會看到行中的任何變動,直到事務提交后發出新的查詢。達夢數據庫提供了全自動回滾管理機制來管理回滾信息和ROLL表空間,全自動回滾管理消除了管理回滾段的復雜性。此外,系統將盡可能保存回滾信息,以滿足用戶查詢回滾信息的需要。事務被提交后,回滾數據不能再回滾或恢復,但是從數據讀一致性的角度出發,長時間進行查詢可能需要這些早期的回滾信息生成早期的數據頁鏡像,基于此,達夢數據庫需要盡可能長時間地保存回滾信息。達夢數據庫會收集回滾信息的使用情況,并根據統計結果對回滾信息的保存周期進行調整,數據庫將回滾信息的保存周期設置為比系統中活動的最長查詢時間稍長一些。
- Microsoft SQL Server企業級平臺管理實踐
- SQL Server 2012數據庫技術與應用(微課版)
- 從0到1:數據分析師養成寶典
- 計算機信息技術基礎實驗與習題
- Creating Mobile Apps with Sencha Touch 2
- 正則表達式必知必會
- Python廣告數據挖掘與分析實戰
- Live Longer with AI
- Hands-On Mathematics for Deep Learning
- INSTANT Android Fragmentation Management How-to
- 一本書講透Elasticsearch:原理、進階與工程實踐
- Hadoop集群與安全
- 數據修復技術與典型實例實戰詳解(第2版)
- 企業主數據管理實務
- Unity Game Development Blueprints