第4 24周 頁面限制8060 bytes

2021-09-08 10:54:48 字數 3482 閱讀 3710

恭喜您!

在你面前就只剩下幾頁了,然後你就可以完成第1個月的sql server效能調優培訓

了。今天我將講下頁的一些限制,還有為什麼你會喜歡這些限制,同時也會討厭這些限制。

正如你在第2周學到的,資料頁始終是8kb 的大小,而且你只能在上面儲存8060 bytes。你的記錄大小指示你在乙個頁裡可以儲存多少記錄。當你與像char,int,datetime等定長型別資料型別打交道時,你會發現sql server有記錄長度不能超過8060 bytes長度(包含7 bytes 的內部行開銷)的限制。

當你的表少於8列時,你需要(為每條記錄)增加額外7 bytes 的內部行開銷。對每增加的8列都要增加額外的1 byte, 例如,17列,你需要9 btyes的內部行開銷(7+1+1)。如果你嘗試建立更長的記錄大小,sql server會在你執行create table語句時返回乙個錯誤資訊給你。來看看下面的表定義:

1

create

table

toolargetable12(

3    column1 char(5000

),4    column2 char(3000

),5    column3 char(54)6

)7go

正如你所見,每條記錄需要8061 bytes(5000+3000+54+7 bytes)。因此在這種情況下,當你嘗試去建立這個表時,sql server會返回下列的錯誤資訊。

當你建立超過8列的表時,你需要把sql server需要的8 bytes的行內部開銷也算進去。

1

create

table

toolargetable22(

3    column1 char(1000) not

null,   column2 char(1000) not

null

,4    column3 char(1000) not

null,   column4 char(1000) not

null

,5    column5 char(1000) not

null,   column6 char(1000) not

null

,6    column7 char(1000) not

null,   column8 char(1000) not

null

,7    column9 char(53) not

null8)

9go

因此這裡又是乙個非法的表定義(8000+53+8 bytes),這裡sql server會返回乙個錯誤資訊。

在上一環節我已經向你展示了頁面限制你喜歡的一面,因為當你在建立這樣表的時候,sql server會返回你乙個錯誤資訊。但是頁面限制也有你討厭的一面,因為sql server會允許你建立這樣的表,而且有時insert語句執行成功,有時卻會失敗……我們來看下。

這裡我們面對的問題是與像varchar等變長資料型別。當這些列不能存在它本身頁時,sql server會把它們移動到在另外頁面的行偏移位置。這個被稱為行溢位頁(row-overflow page)。sql server會

在原來的頁面

留下24 bytes長的指向行溢位頁的指標。

在於其他列組合時的某些情況下,這個指標會溢位8060 bytes的限制。我們來看下下面的表定義:

1

create

table

toolargetable32(

3    column1 char(5000

),4    column2 char(3000

),5    column3 char(30

),6    column4 varchar(3000)7

)8go

如你所見,這裡我使用了varchar(3000)的資料型別。你會看到sql server這裡會給你乙個警告資訊。這個警告提示你可以建立這個表,但在執行insert/update語句時可能會失敗……

下面在表裡的插入語句會成功:

1

insert

into toolargetable3 values2(

3replicate('

x', 5000),4

replicate('

x', 3000),5

replicate('

x', 30),6

replicate('

x', 19)7

)8go

這裡的記錄大小是8056 bytes長(5000+3000+30+19+7 bytes)。在這個情況下,sql server會把第4列的資料儲存在主資料頁。但是想像下下面的insert語句:

1

insert

into toolargetable3 values2(

3replicate('

x', 5000),4

replicate('

x', 3000),5

replicate('

x', 30),6

replicate('

x', 3000)7

)8go

在剛才的insert語句,sql server會把第4列資料移到行溢位頁(row-overflow page),因為這3000 bytes 不能在主資料頁裡放下。這也就意味著sql server會在這裡留下乙個指向不同頁且24bytes 長的指標,在那個位置可以找到資料。但是我們的記錄大小現在是8061 bytes長(5000+3000+30+24+7 bytes)。

duang,你的記錄長度超過8060 bytes,insert語句執行失敗了!

這些就是壞的限制,因為他們在資料庫操作的時候隱藏著,好的一面就是在你定義表架構的時候如上所示可見的。想想看是啥?

在你設計你的表結構時,你要非常仔細的想下你的操作。在sql server裡與頁打交道時你會碰到很多這樣的執行進去後才出現的限制。當然,在sql server給你錯誤資訊時,你不允許建立這個表,基本上就天下太平了。

噹噹你收到警告時,基本上每個人會想不都不想下就忽略掉。這始終是個壞的操作,因為你已經看到了,你的insert可能在執行時失敗,問題的發生你是可以預見的。我希望你現在已經明白這個效能調優培訓是個很好內幕公開,並且為什麼理解資料頁的內部結構是多麼重要!

0511_04頁面限制8060_bytes.rar

第4 24周 頁面限制8060 bytes

恭喜您!在你面前就只剩下幾頁了,然後你就可以完成第1個月的sql server效能調優培訓 了。今天我將講下頁的一些限制,還有為什麼你會喜歡這些限制,同時也會討厭這些限制。正如你在第2周學到的,資料頁始終是8kb 的大小,而且你只能在上面儲存8060 bytes。你的記錄大小指示你在乙個頁裡可以儲存...

小議404頁面

一 什麼是404頁面?404頁面是客戶端在瀏覽網頁時,伺服器無法正常提供資訊,或是伺服器無法回應,且不知道原因所返回的頁面。404錯誤資訊通常是在目標頁面被更改或移除,或客戶端輸入頁面位址錯誤後顯示的頁面。完成404頁面的製作,是必要的,展示效果如下 輸入乙個不存在的頁面,如 二 404頁面有什麼作...

025 頁面元素

1.css內建公共基礎類 2.css命名規範 2.1.class命名字首 layui 連線符 如 class layui form 2.2.命名格式一般分為兩種 layui 狀態或型別和layui 模組名 狀態或型別。因為有些類並非是某個模組所特有,他們通常會是一些公共類。如 定義內聯塊狀元素 cl...