SQL SERVER單頁資料儲存行數計算

2021-05-10 05:16:45 字數 1541 閱讀 3563

應用示例:

-- 建立2個測試表

create table [dbo].[table_2019]([data] [nchar](2019) not null)

create table [dbo].[table_2020]([data] [nchar](2020) not null)

go -- 填充資料

declare @i int

set @i = 0

while(@i < 20)

begin

insert table_2019(data) values('')

insert table_2020(data) values('')

select @i = @i + 1

end

go 檢視每個表所占用的空間,結果:

table_2020 表資料佔了 160kb ,table_2019 表資料佔了 80 kb

解釋:

sql server頁定義:

在 sql server 中,頁的大小為 8 kb。這意味著 sql server 資料庫中每 mb 有 128 頁。每頁的開頭是 96 位元組的標頭,用於儲存有關頁的系統資訊

在 sql server 2005 中,行不能跨頁,但是行的部分可以移出行所在的頁,因此行實際可能非常大。頁的單個行中的最大資料量和開銷是 8,060 位元組 (8 kb)。

在資料頁上,資料行緊接著標頭按順序放置。頁的末尾是行偏移表,對於頁中的每一行,每個行偏移表都包含乙個條目。每個條目記錄對應行的第乙個位元組與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。

計算:

計算總的行大小:

row_size = fixed_data_size + variable_data_size + null_bitmap + 4

公式中的值 4 是資料行的行標題開銷。

由於nchar是固定長度,所以variable_data_size=0

保留行中稱為 null 點陣圖的部分以管理列的為空性。計算其大小:

null_bitmap = 2 + ((num_cols + 7) / 8)

由於只有一列,所以null_bitmap = 3

由以上原則可以計算:

nchar(2019): 2019×2+0+3+4=4045

nchar(2020): 2020×2+0+3+4=4047

微軟給出的每頁容納行數計算公式:

計算每頁的行數(每頁有 8096 個可用位元組):

rows_per_page = 8096 / (row_size + 2)

因為行不跨頁,所以每頁的行數應向下捨入到最接近的整數。公式中的數值 2 是計算行數時引入的行大小餘量。

nchar(2019): 8096/(4045+2)=2.000494193229

nchar(2020): 8096/(4047+2)=1.999506050876

據以上計算,可以得出,一頁可以儲存只有一列nchar(2019)資料的行數為2行,而儲存只有一列nchar(2020)資料的行數為1行。

Redis儲存分頁資料

普通分頁 一般分頁做快取都是直接查詢出來,按頁放到快取裡,但是這種快取方式有很多缺點。如快取不能及時更新,一旦資料有變化,所有的之前的分頁快取都失效了。比如像微博這樣的場景,微博下面現在有乙個頂次數的排序。這個用傳統的分頁方式很難應對。一種思路 最近想到了另一種思路。資料以id為key快取到redi...

sql server中的分頁資料查詢

今天在工作中遇到乙個需要進行sql server分頁資料查詢的問題,但是分頁資料查詢的sql卻忘記了,最終通過查詢資料解決了該問題。現在把解決方法記下,以備查閱。在這裡需要感謝的qlin 假設需要查詢表為test,test表中有個字段為id 我這裡用的是int型 當前頁pageindex 5,頁大小...

easyPOI單sheet頁資料匯出為excle

1 資料匯入匯出是很多管理系統都需要的一項基本功能,相對於比較easyexcle和easypoi,用過的可能都知道,easypoi做匯出那是真的方便還好用,你想要的姿勢,她 都可以實現。話不多說上 先來單個sheet頁匯出 pom依賴官網就有,為什麼要這樣寫呢,因為,官網有點吸引人,功能太多值得一看...