數(shù)據(jù)庫空間管理

數(shù)據(jù)庫空間管理 學習筆記

SQL Server 中數(shù)據(jù)存儲的基本單位是頁(Page)。磁盤I/O 操作在頁級執(zhí)行。

SQL Server 讀取或?qū)懭霐?shù)據(jù)的最小單位就是以8 KB 為單位的頁。

每頁的開頭是一個96 B 的頁頭,用于存儲有關(guān)頁的系統(tǒng)信息。包括頁碼、頁類型、頁的可用空間,以及擁有該頁

的對象的分配單元ID。不同類型的數(shù)據(jù),存儲在不同類型的頁面里。

在正常數(shù)據(jù)頁上,數(shù)據(jù)行緊接著頁的標頭按順序放置。頁的末尾是行偏移量表,對于頁中的每一行,每個行偏移表都包含一個條目。

每個條目記錄對應行的第一個字節(jié)與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。

——————此處插入宋大神的注解————————

除了頁頭占用的空間和行偏移矩陣占用的空間,中間剩下的空間就是給數(shù)據(jù)行使用的。一個數(shù)據(jù)行中還存在其他的信息用于表示該行數(shù)據(jù),具體的結(jié)構(gòu)是這樣的:狀態(tài)位A 1字節(jié)狀態(tài)位B 1字節(jié)定長數(shù)據(jù)類型的長度 2字節(jié)定長數(shù)據(jù)的內(nèi)容 具體定長數(shù)據(jù)字節(jié)列數(shù) 2字節(jié)NULL位圖 列數(shù)/8個字節(jié)變長列的個數(shù) 2字節(jié)變長列的偏移矩陣 變長列個數(shù)*2個字節(jié)變長列的數(shù)據(jù) 具體變長數(shù)據(jù)字節(jié) 這些最少占據(jù)1+1+2+2+1=7

——————————————————————-

輸出指定的頁面,可以使用:DBCC PAGE(, , , )

Db_id 可以從sp_helpdb 的結(jié)果中得到。

File_id 可以從sp_helpfile 的結(jié)果中得到。

Format_id 是你指定的輸出格式。

在運行DBCC PAGE 之前,還需要打開跟蹤標志(trace flag)3604

在 SQL Server 中,行不能跨頁,屬于同一行的所有字段的數(shù)據(jù)都要放在同一個頁面里。頁的最大數(shù)據(jù)量是8 060 B(8 KB)。

所以一般數(shù)據(jù)類型字段所組成的一行,最長加起來不能超過8 KB。

但是,這一限制不包括Text/Image數(shù)據(jù)類型字段的數(shù)據(jù)。

這些類型字段的數(shù)據(jù)會被單獨存放在LOB(LargeObject)頁面里。

SQL Server 2005 開始的版本中,提供了varchar(max)、nvarchar(max)、varbinary(max)這樣的數(shù)據(jù)類型。

如果包含這一類數(shù)據(jù)類型字段的行,總長不超過8 KB,數(shù)據(jù)還是會一起存放在普通數(shù)據(jù)頁面里。

如果總長超過了8 KB,SQL Server 就會把這些字段的數(shù)據(jù)分開,單獨存放在一種叫Row-Overflow(行溢出)的頁面里。

區(qū)(Extent)是8 個物理上連續(xù)的頁的集合,用來有效地管理頁。所有頁都存儲在區(qū)中。

? 統(tǒng)一區(qū),由單個對象所有。區(qū)中的所有8 頁只能由一個對象使用。

? 混合區(qū),最多可由8 個對象共享。區(qū)中8 頁的每頁可由不同的對象所有。但是一頁總是只能屬于一個對象。

通常從混合區(qū)向新表或索引分配頁。當表或索引增長到8 頁時,將變成使用統(tǒng)一區(qū)進行后續(xù)分配。

DBCC SHOWFILESTATS

這個命令能直接從GAM 和SGAM 這樣的系統(tǒng)分配頁面上面讀取區(qū)分配信息,直接算出數(shù)據(jù)庫文件里有多少區(qū)已被分配。

sp_spaceused (+ updateusage才會準確)

DBCC SHOWCONTIG( 慎用,SQL Server 2005 之后可以使用sys.dm_db_index_physical_stats)

sys.dm_db_partition_stats

可以從頁面這個級別來分析檢查數(shù)據(jù)庫空間大小。

日志文件不是按頁/區(qū)來組織的。

數(shù)據(jù)庫引擎在內(nèi)部將每一物理日志文件分成多個虛擬日志單元。虛擬日志單元沒有固定大小,

且一個物理日志文件所包含的虛擬日志單元數(shù)不固定。

日志文件每自動增長一次,會至少增加一個虛擬日志單元。

如果一個日志文件經(jīng)歷了多次小的自動增長,里面的虛擬日志單元數(shù)目會比正常的日志文件多很多。

這種情況會影響到日志文件管理的效率,甚至造成數(shù)據(jù)庫啟動要花很長時間。

事務(wù)日志是一種回繞的文件。當創(chuàng)建數(shù)據(jù)庫時,邏輯日志文件從物理日志文件的始端開始。

新日志記錄被添加到邏輯日志的末端,然后向物理日志的末端擴張。

當邏輯日志的末端到達物理日志文件的末端時,新的日志記錄將回繞到物理日志文件的始端,繼續(xù)向后寫。

DBCC SQLPERF(LOGSPACE)可以查看日志文件的使用情況。

Tempdb 系統(tǒng)數(shù)據(jù)庫是一個全局資源,可供連接到SQL Server 實例的所有用戶使用,在SQL Server2005 中,用于保存下列各項:

用戶對象

? 用戶定義的表和索引。

? 系統(tǒng)表和索引。

? 全局臨時表和索引。

? 局部臨時表和索引。

? table 變量。

? 表值函數(shù)中返回的表。

內(nèi)部對象

? 用于游標或假脫機操作以及臨時大型對象(LOB)存儲的工作表。

? 用于哈希聯(lián)接或哈希聚合操作的工作文件。

? 用于創(chuàng)建或重新生成索引等操作(如果指定了SORT_IN_TEMPDB)的中間排序結(jié)果,

或者某些GROUP BY、ORDER BY 或UNION 查詢的中間排序結(jié)果。

每個內(nèi)部對象至少使用9 頁:一個IAM 頁,一個8 頁的區(qū)。

版本存儲區(qū)

? 由使用快照隔離級別或已提交讀隔離級別(基于行版本控制)的數(shù)據(jù)庫中的數(shù)據(jù)修改事務(wù)生成的行版本。

? 由數(shù)據(jù)修改事務(wù)為實現(xiàn)聯(lián)機索引操作、多個活動的結(jié)果集(MARS)以及AFTER 觸發(fā)器等功能而生成的行版本。

Tempdb 空間使用的一大特點,是只有一部分對象,例如用戶創(chuàng)建的臨時表、table 變量等,

可以用sys.allocation_units 和sys.partitions 這樣的管理視圖來管理。

tempdb 的空間使用是不能用sp_spaceused 來跟蹤的。(不準確)

sys.dm_db_file_space_usage這張視圖能反映tempdb 在幾個大類里的空間使用分布。

是用戶對象(user_object_reserved_page_count),還是系統(tǒng)對象(internal_object_reserved_page_count)

,還是版本存儲區(qū)(version_store_reserved_page_count)。

以上就是數(shù)據(jù)庫空間管理的內(nèi)容,更多相關(guān)文章請關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享