sql server 儲存機制

2022-02-15 17:29:28 字數 2670 閱讀 3829

1、區段

區段(extent)是用來為表和索引分配空間的基本儲存單元。它由8個連續的64kb資料頁組成。

基於區段(而不是實際使用空間)分配空間的概念的要點:

一旦區段已滿,那麼下一記錄將要佔據的空間不是記錄的大小,而是整個新區段的大小。一次分配乙個區段而不是分配乙個記錄。

通過預分配空間,sql server節省為每個記錄分配新空間的時間。

向當前分配的區段新增了過多的行就要占用整個區段,看起來是一種浪費,但是這種方法浪費的空間不多。但是,這些浪費的空間會累加,特別是在碎片較多的環境中。

佔據所有空間的好處是sql server省去了一些分配時間的系統開銷,不需在每次寫入行時都考慮分配問題,sql server僅僅當需要新區段時才處理額外的空間分配。

不要將區段占用的空間和資料庫占用的空間想混淆,分配給資料庫的那些空間就是磁碟驅動器將要減少的可用空間。區段僅僅是在又資料庫保留的整個空間內再次進行分配的方式。

2、頁

頁是特定區段中的分配單元。每個區段包含8頁。

也是在到達實際資料行前所能達到的最後乙個儲存級別。儘管每個區段中的頁數是固定的,但是每一頁中的行數不是固定的。這取決於行的大小,而行的大小是可以變化的。可以把頁看做是錶行和索引行資料的容器。通常不允許跨行。

常用的頁型別:

1、資料頁:資料也是不需解釋的-它們是表中的實際資料,但任何沒有用text in row選項、varchar(max)或varbinary(max)定義的blob資料除外。

2、索引頁:索引頁也是相當直觀-它們既包括非群集索引的非頁級和頁級頁,又包括群集索引的非頁級頁。

在sql server中,儲存的最小單位是頁。sql server對於頁的讀取,要麼整個讀取,要麼完全不讀取,沒有折中。

資料庫頁的大小是8k,實際能夠儲存的資料量為1024*8=8192-頁頭(96)-行偏移(36)=8060位元組。

頁拆分

當頁滿時,它會進行拆分。這意味著多個新頁被分配-也意味著現有頁上又近半的資料被移到新頁上。

在使用群集索引時,會有例外。如果有乙個群集索引,並且下乙個插入的記錄在物理上將作為表中的最後乙個記錄,那麼建立乙個新頁,然後將該新行新增到這個新頁中,而不需要重新定位任何現有資料。

3、行

行就是表中的一行記錄。行最大可達8kb。除了8060字元限制外,還有最大1024標準列(非稀疏列)的限制,列就是表的一列資料,就是你理解的列。實際上,突破8060字元限制前用完列的情況不多見。1024提供了小於8位元組的平均列寬度。1024個列,乙個表通常才十幾個列啊。當突破了1024個列時,就要運用到稀疏列。

4、稀疏列

稀疏列是sql server2008新引入的一種特殊的資料結構。它們主要用於處理重複的場景,其中的列只是偶爾會用到。大部分時候為空。許多時候,一旦遇到少量這類列,就意味著以後可能會遇到大量這類列。使用稀疏列,可以將單個表中允許的列的總數提高到30000。30000個列,什麼概念?什麼系統用得到這麼多列。

image、text、ntext、geography、geometry、timestamp和所有使用者自定義資料型別不能被標記為稀疏列。

在sql server中,資料的儲存以頁為單位。八個頁為乙個區。一頁為8k,乙個區為64k,這個意味著1m的空間可以容納16個區。如圖1所示:

圖1.sql server中的頁和區

如圖1(ps:發現用windows自帶的畫圖程式畫部落格中的也不錯

)可以看出,sql server中的分配單元分為三種,分別為儲存行內資料的in_row_data,儲存lob物件的lob_data,儲存溢位資料的row_overflow_data。下面我們通過乙個更具體的例子來理解這三種分配單元。

我建立如圖2所示的表。

圖2.測試表

圖2的測試表不難看出,通過插入資料使得每一行的長度會超過每頁所能容納的最大長度8060位元組。使得不僅產生了行溢位(row_overflow_data),還需要儲存lob的頁.測試的插入語句和通過dbcc ind看到的分配情況如圖3所示。

圖3.超過8060位元組的行所分配的頁

除去iam頁,這1行資料所需要三個頁來儲存。首先是lob頁,這類是用於儲存存在資料庫的二進位制檔案所設計,當這個型別的列出現時,在原有的列會儲存乙個24位元組的指標,而將具體的二進位制資料存在lob頁中,除去text之外,varbinary(max)也是存在lob頁中的。然後是溢位行,在sql server 2000中,一行超過8060位元組是不被允許的,在sql server 2005之後的版本對這個特性進行了改進,使用varchar,nvarchar等資料型別時,當行的大小不超過8060位元組時,全部存在行內in-row data,當varchar中儲存的資料過多使得整行超過8060位元組時,會將額外的部分存於row-overflow data頁中,如果update這列使得行大小減少到小於8060位元組,則這行又會全部回到in-row data頁。

SqlServer安全機制

sql server的三層安全模型 a 身份驗證 b 資料庫使用者 c 資料庫中資料的許可權設定 登入驗證 a 分類 sql server身份驗證 windows 身份驗證 b 建立登陸sql server的使用者 通過企業管理器建立 通過查詢分析器來建立 exec sp addlogin 使用者名...

SQL server鎖的機制

sql server 的所有活動都會產生鎖。鎖定的單元越小,就越能越能提高併發處理能力,但是管理鎖的開銷越大。如何找到平衡點,使併發性和效能都可接受是 sql server 的難點。sql server 有如下幾種瑣 1 共享鎖用於唯讀操作 select 鎖定共享的資源。共享鎖不會阻止其他使用者讀,...

sql server儲存過程

建立表的語句 create table student sno int primary key,sname nvarchar 30 sgentle nvarchar 2 sage int,sbirth smalldatetime,sdept nvarchar 30 drop table studen...