數(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)!