資料庫空間管理 學習筆記

2022-02-14 16:41:03 字數 3131 閱讀 6563

sql server 中資料儲存的基本單位是頁(page)。磁碟i/o 操作在頁級執行。

sql server 讀取或寫入資料的最小單位就是以8 kb 為單位的頁。

每頁的開頭是乙個96 b 的頁頭,用於儲存有關頁的系統資訊。包括頁碼、頁型別、頁的可用空間,以及擁有該頁

的物件的分配單元id。不同型別的資料,儲存在不同型別的頁面裡。

在正常資料頁上,資料行緊接著頁的標頭按順序放置。頁的末尾是行偏移量表,對於頁中的每一行,每個行偏移表都包含乙個條目。

每個條目記錄對應行的第乙個位元組與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。

------------------此處插入宋大神的註解------------------------

除了頁頭占用的空間和行偏移矩陣占用的空間,中間剩下的空間就是給資料行使用的。乙個資料行中還存在其他的資訊用於表示該行資料,具體的結構是這樣的:

狀態位a        1位元組

狀態位b         1位元組

定長資料型別的長度     2位元組

定長資料的內容         具體定長資料位元組

列數              2位元組

null點陣圖       列數/8個位元組

變長列的個數     2位元組

變長列的偏移矩陣    變長列個數*2個位元組

變長列的資料            具體變長資料位元組

這些最少佔據1+1+2+2+1=7 

輸出指定的頁面,可以使用:dbcc page(, , , )

db_id 可以從sp_helpdb 的結果中得到。

file_id 可以從sp_helpfile 的結果中得到。

format_id 是你指定的輸出格式。

在執行dbcc page 之前,還需要開啟跟蹤標誌(trace flag)3604

在 sql server 中,行不能跨頁,屬於同一行的所有欄位的資料都要放在同乙個頁面裡。頁的最大資料量是8 060 b(8 kb)。

所以一般資料型別欄位所組成的一行,最長加起來不能超過8 kb。

但是,這一限制不包括text/image資料型別欄位的資料。

這些型別欄位的資料會被單獨存放在lob(largeobject)頁面裡。

sql server 2005 開始的版本中,提供了varchar(max)、nvarchar(max)、varbinary(max)這樣的資料型別。

如果包含這一類資料型別欄位的行,總長不超過8 kb,資料還是會一起存放在普通資料頁面裡。

如果總長超過了8 kb,sql server 就會把這些欄位的資料分開,單獨存放在一種叫row-overflow(行溢位)的頁面裡。

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

• 統一區,由單個物件所有。區中的所有8 頁只能由乙個物件使用。

• 混合區,最多可由8 個物件共享。區中8 頁的每頁可由不同的物件所有。但是一頁總是只能屬於乙個物件。

通常從混合區向新錶或索引分配頁。當表或索引增長到8 頁時,將變成使用統一區進行後續分配。

dbcc showfilestats

這個命令能直接從gam 和sgam 這樣的系統分配頁面上面讀取區分配資訊,直接算出資料庫檔案裡有多少區已被分配。

sp_spaceused (+ updateusage才會準確)

dbcc showcontig( 慎用,sql server 2005 之後可以使用sys.dm_db_index_physical_stats)

sys.dm_db_partition_stats

可以從頁面這個級別來分析檢查資料庫空間大小。

日誌檔案不是按頁/區來組織的。

資料庫引擎在內部將每一物理日誌檔案分成多個虛擬日誌單元。虛擬日誌單元沒有固定大小,

且乙個物理日誌檔案所包含的虛擬日誌單元數不固定。

日誌檔案每自動增長一次,會至少增加乙個虛擬日誌單元。

如果乙個日誌檔案經歷了多次小的自動增長,裡面的虛擬日誌單元數目會比正常的日誌檔案多很多。

這種情況會影響到日誌檔案管理的效率,甚至造成資料庫啟動要花很長時間。

事務日誌是一種迴繞的檔案。當建立資料庫時,邏輯日誌檔案從物理日誌檔案的始端開始。

新日誌記錄被新增到邏輯日誌的末端,然後向物理日誌的末端擴張。

當邏輯日誌的末端到達物理日誌檔案的末端時,新的日誌記錄將迴繞到物理日誌檔案的始端,繼續向後寫。

dbcc sqlperf(logspace)可以檢視日誌檔案的使用情況。

tempdb 系統資料庫是乙個全域性資源,可供連線到sql server 例項的所有使用者使用,在sql server2005 中,用於儲存下列各項:

使用者物件

• 使用者定義的表和索引。

• 系統表和索引。

• 全域性臨時表和索引。

• 區域性臨時表和索引。

• table 變數。

• 錶值函式中返回的表。

內部物件

• 用於游標或假離線操作以及臨時大型物件(lob)儲存的工作表。

• 用於雜湊聯接或雜湊聚合操作的工作檔案。

• 用於建立或重新生成索引等操作(如果指定了sort_in_tempdb)的中間排序結果,

或者某些group by、order by 或union 查詢的中間排序結果。

每個內部物件至少使用9 頁:乙個iam 頁,乙個8 頁的區。

版本儲存區

• 由使用快照隔離級別或已提交讀隔離級別(基於行版本控制)的資料庫中的資料修改事務生成的行版本。

• 由資料修改事務為實現聯機索引操作、多個活動的結果集(mars)以及after 觸發器等功能而生成的行版本。

tempdb 空間使用的一大特點,是只有一部分物件,例如使用者建立的臨時表、table 變數等,

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

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

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

是使用者物件(user_object_reserved_page_count),還是系統物件(internal_object_reserved_page_count)

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

Redis 資料庫管理 學習筆記四

redis預設有16個資料庫 select 15 選擇第15個資料庫 flushdb 清除資料庫 慢查詢日誌 slowlog log slower than 0表示所有的都記錄,單位是微秒 slowlog log slower than 0 所有的都不記錄 slowlog max len 慢查詢儲存...

oracle資料庫賬戶管理學習

常用許可權試圖查詢 1.檢視所有使用者 select from dba users select from all users select from user users 2.檢視使用者或角色系統許可權 select from dba sys privs select from user sys ...

記憶體管理學習筆記

1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...