999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

在SQL Server中估算非聚集索引的大小

2018-05-02 07:51:38岳莉
教育教學(xué)論壇 2018年16期

摘要:SQL Server是占有市場份額較大的一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)。本文討論在數(shù)據(jù)庫設(shè)計(jì)階段的一項(xiàng)優(yōu)化技術(shù),估算非聚集索引的大小。索引的設(shè)計(jì)將最終決定數(shù)據(jù)庫運(yùn)行的性能。除去必要的聚集索引,非聚集索引也是數(shù)據(jù)庫設(shè)計(jì)中的重要環(huán)節(jié)。

關(guān)鍵詞:SQL Server;數(shù)據(jù)庫大小;非聚集索引;估算非聚集索引大小

中圖分類號:G642.0 文獻(xiàn)標(biāo)志碼:A 文章編號:1674-9324(2018)16-0268-03

SQL Server作為微軟的數(shù)據(jù)庫管理系統(tǒng)主要解決了中小企業(yè)數(shù)據(jù)管理需求。在設(shè)計(jì)應(yīng)用軟件的數(shù)據(jù)庫部分時,我們經(jīng)常遇到一個問題,那就是:數(shù)據(jù)庫的初始大小定義多少更合理呢?這就是估算數(shù)據(jù)庫大小的問題。數(shù)據(jù)庫的大小由數(shù)據(jù)庫中所有表的大小決定,即數(shù)據(jù)庫的大小是全部數(shù)據(jù)表之和。估算數(shù)據(jù)表占用存儲空間的大小時,有如下兩種情況:(1)沒有設(shè)計(jì)主鍵的表我們稱之為堆;(2)設(shè)計(jì)了主鍵(唯一聚集索引)的表。在這兩種表中我們都可以為經(jīng)常查詢的字段或字段組合創(chuàng)建索引,這種索引屬于非聚集索引(可以唯一也可以不唯一)。

在SQL Server中一個表有且僅有一個唯一聚集索引就是主鍵,但是可以有多個非聚集索引,針對應(yīng)用程序中經(jīng)常查詢需要用到的字段或字段組合我們可以為其設(shè)計(jì)非聚集索引。本文以student表為例,為經(jīng)常需要查詢的字段“姓名”建立非唯一非聚集索引,并通過3個步驟對該非聚集索引的大小進(jìn)行估算。首先說明SQL Server中對索引的存儲。當(dāng)我們?yōu)楸韯?chuàng)建了一個非聚集索引時,數(shù)據(jù)庫管理系統(tǒng)將建立起一顆B-樹用來存儲該索引。在B-樹中有兩類節(jié)點(diǎn):(1)非葉級節(jié)點(diǎn);(2)葉級節(jié)點(diǎn)。非葉級節(jié)點(diǎn)保存了鍵值之間的排列關(guān)系,而葉級節(jié)點(diǎn)用來存儲指針(該指針指向記錄的實(shí)際存儲位置)。所以兩類節(jié)點(diǎn)的估算方法不同。我們先用T-SQL語句聲明student表的表結(jié)構(gòu)并為“姓名”字段設(shè)計(jì)非聚集索引。

CREATE TABLE student

(Stu_number CHAR(6) CONSTRAINT PK_number_STUDENT PRIMARY KEY NOT NULL,

Name VARCHAR(20) NOT NULL,--非聚集索引的索引關(guān)鍵字(索引鍵),只有一個字段

Specialty CHAR(20) NOT NULL,

Gender BIT NOT NULL CONSTRAINT DFT_ Gender _STUDENT DEFAULT 1,--注釋:1 男,0 女

Birthday SMALLDATETIME NOT NULL,

Total_credits TINYINT NULL

) --創(chuàng)建student表

GO

CREATE INDEX IND_name_STUDENT ON student(Name) --為“姓名”字段創(chuàng)建非聚集索引,索引的名字為IND_NAME_STUDENT,考慮到現(xiàn)實(shí)中的重名的情況,該索引不唯一。

下面我們就通過3個步驟來計(jì)算student表的IND_name_STUDENT索引所占用的存儲空間。

一、計(jì)算用于存儲非聚集索引的非葉級節(jié)點(diǎn)的空間

1.預(yù)估表中的行數(shù): Num_Rows =1,000,000,因該表定義了聚集索引(主鍵),當(dāng)行數(shù)超過10,000,000時,存儲聚集索引的B樹深度會增加,使得存儲空間與記錄行之間不再是線性漸變關(guān)系,因此我們將表中的行數(shù)設(shè)定在1,000,000。此問題可參看《Relational Database Architecture Refine Based on the Storage Space Estimate》。

2.指定索引鍵中固定長度和可變長度列的數(shù)量,并計(jì)算存儲所需的空間:索引鍵列可以包括固定長度和可變長度列。要估計(jì)內(nèi)部級別索引行的大小,需計(jì)算每組列在索引行中所占據(jù)的空間。列的大小取決于該列的數(shù)據(jù)類型和長度。

Num_Key_Cols = 總鍵列數(shù)(固定長度和可變長度)=1column

Fixed_Key_Size = 所有固定長度鍵列的總字節(jié)大小=0 byte

Num_Variable_Key_Cols = 可變長度鍵列的數(shù)量=1column

Max_Var_Key_Size = 所有可變長度鍵列的最大字節(jié)大小=20byte

3.如果索引不是唯一的,對數(shù)據(jù)行定位符的計(jì)算方法如下:如果非聚集索引不是唯一的,數(shù)據(jù)行定位符將與非聚集索引鍵組合使用,以便為每一行生成唯一的鍵值。

(1)如果非聚集索引在堆上,則數(shù)據(jù)行定位符是堆RID。其大小是8個字節(jié),公式如下。但在stduent表中由于定義了主鍵,因此IND_name_STUDENT索引不是定義在堆上,不適用此種情況,只給出公式不做計(jì)算。

Num_Key_Cols = Num_Key_Cols + 1

Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1

Max_Var_Key_Size = Max_Var_Key_Size + 8

(2)如果非聚集索引在聚集索引之上,則數(shù)據(jù)行定位符是聚集鍵。必須與非聚集索引鍵結(jié)合使用的列是聚集鍵中的以下列:不在非聚集索引鍵列集中的列。Student表符合該情況,因此計(jì)算如下:

Num_Key_Cols =Num_Key_Cols+不在非聚集索引鍵列集中的聚集鍵列數(shù)(如果聚集索引不唯一,則加1)=1+1=2

Fixed_Key_Size =Fixed_Key_Size+不在非聚集索引鍵列集中的固定長度聚集鍵列的總字節(jié)大小=0+6=6byte

Num_Variable_Key_Cols =Num_Variable_Key_Cols+

不在非聚集索引鍵列集中的可變長度聚集鍵列數(shù)(如果聚集索引不唯一,則加1)=1+0=1.

Max_Var_Key_Size =Max_Var_Key_Size+不在非聚集索引鍵列集中的可變長度聚集鍵列的最大字節(jié)大小(如果聚集索引不唯一,則加4)=20+0=20byte

說明:student表的主鍵PK_number_STUDENT是唯一聚集索引,它只有固定長度為6byte的1個列,沒有可變長度的列,因此:不在非聚集索引鍵列集中的聚集鍵列數(shù)為1,不在非聚集索引鍵列集中的固定長度聚集鍵列的總字節(jié)大小為6byte,不在非聚集索引鍵列集中的可變長度聚集鍵列數(shù)=0column,不在非聚集索引鍵列集中的可變長度聚集鍵列的最大字節(jié)大小=0byte。

4.保留行的一部分(稱為“空位圖”),以管理列的為空性。計(jì)算大小:如果索引鍵中有可為空的列(包括步驟一.3 中所述的所有必要的聚集鍵列),則保留索引行的一部分,以用于空位圖。

Index_Null_Bitmap = 2 +((可為空值的鍵列數(shù) + 7)/ 8) 對表達(dá)式取整。 如果沒有可為空的鍵列,將 Index_Null_Bitmap設(shè)置為 0。由于IND_name_STUDENT的索引鍵中沒有可以為空的列。所以將Index_Null_Bitmap=0.

5.計(jì)算可變長度數(shù)據(jù)大小:如果索引鍵中有可變長度的列(包括所有必要的聚集索引鍵列),確定存儲索引行中的這些列需使用的空間:Variable_Key_Size = 2 + (Num_Variable_Key_Cols×2) + Max_Var_Key_Size此時我們假定頁的填滿度為100%。如果頁的填滿度低,可以按照比例調(diào)整 Max_Var_Key_Size 值,從而對整個表大小得出一個更準(zhǔn)確的估計(jì)。如果沒有可變長度列,將 Variable_Key_Size 設(shè)置為 0。在student表中,Variable_Key_Size =2+(1×2)+20=24byte

6.計(jì)算索引行大小:Index_Row_Size= Fixed_Key_Size+Variable_Key_Size+Index_Null_Bitmap

+1(對應(yīng)于索引行的行標(biāo)題開銷)+ 6(對應(yīng)于子頁 ID 指針)=6+24+0+1+6=37byte

7.計(jì)算每頁的索引行數(shù)(每頁可存儲 8096字節(jié)): Index_Rows_Per_Page = 8096/(Index_Row_Size + 2) 由于索引不能跨頁斷行,因此每頁的索引行數(shù)向下取整。公式中的數(shù)值2是計(jì)算行數(shù)時引入的行大小余量。Index_Rows_Per_Page = 8096 /(37+2)=207 row

8.計(jì)算索引中的級別數(shù)(即B-樹的深度):Levels = 1+logIndex_Rows_Per_Page(Num_Rows/Index_Rows_ Per_Page)=1+log207(1,000,000/207)=1.59≈2 height

9.計(jì)算存儲索引所需的頁數(shù):Num_Index_Pages = Level (Index_Rows_Per_Page)其中,1<=Level<=Levels,本例中Num_Index_Pages=207+207=208page

10.計(jì)算用于存儲非聚集索引的非葉級節(jié)點(diǎn)的空間大小(每頁可存儲8192字節(jié)):Index_Space_Used=8192×Num_Index_Pages=8192×208=1,703,936byte=1.625MB≈2MB

二、計(jì)算用于存儲非聚集索引的葉級節(jié)點(diǎn)的空間

1.指定葉級的固定長度列和可變長度列的數(shù)量,并計(jì)算存儲這些列所需的空間:如果非聚集索引的索引鍵是單一的列,則使用步驟1中的值(以步驟一.3中修改后為準(zhǔn)):

Num_Leaf_Cols = Num_Key_Cols=2 column

Fixed_Leaf_Size = Fixed_Key_Size=6 byte

Num_Variable_Leaf_Cols = Num_Variable_Key_

Cols=1 column

Max_Var_Leaf_Size = Max_Var_Key_Size=20 byte

如果非聚集索引的索引鍵是多個列的組合,并且這些列中既有可變長度列,也有固定長度列,則對步驟1中的值加上適當(dāng)?shù)闹担ㄒ圆襟E一.3中修改后為準(zhǔn))。列的大小取決于數(shù)據(jù)類型和長度的規(guī)定。

Num_Leaf_Cols = Num_Key_Cols + 包含列數(shù)

Fixed_Leaf_Size = Fixed_Key_Size + 固定長度包含列的總字節(jié)大小

Num_Variable_Leaf_Cols = Num_Variable_Key_

Cols+可變長度包含列數(shù)

Max_Var_Leaf_Size = Max_Var_Key_Size + 可變長度包含列的最大字節(jié)大小

本示例的IND_name_STUDENT索引鍵只有一個可變長度VARCHAR(20)的列NAME,因此無需增加數(shù)值。

2.數(shù)據(jù)行定位符的計(jì)算:如果非聚集索引不是唯一的,若已在步驟一.3中考慮了數(shù)據(jù)行定位符的開銷且不需要進(jìn)行其他的修改,則轉(zhuǎn)到下一步。如果非聚集索引是唯一的,則必須在葉級的所有行中說明數(shù)據(jù)行定位符。

(1)如果非聚集索引在堆上,則數(shù)據(jù)行定位符是堆RID(大小為8字節(jié))。

Num_Leaf_Cols = Num_Leaf_Cols + 1

Num_Variable_Leaf_Cols = Num_Variable_Leaf_

Cols + 1

Max_Var_Leaf_Size = Max_Var_Leaf_Size + 8

(2)如果非聚集索引在聚集索引之上,則數(shù)據(jù)行定位符是聚集鍵。必須與非聚集索引鍵結(jié)合使用的列是聚集鍵中的以下列:不在非聚集索引鍵列集中的列。

Num_Leaf_Cols = Num_Leaf_Cols + 不在非聚集索引鍵列集中的聚集鍵列數(shù)(如果聚集索引不唯一,則加1)

Fixed_Leaf_Size = Fixed_Leaf_Size + 不在非聚集索引鍵列集中的固定長度聚集鍵列數(shù)

Num_Variable_Leaf_Cols = Num_Variable_Leaf_

Cols + 不在非聚集索引鍵列集中的可變長度聚集鍵列數(shù)(如果聚集索引不唯一,則加1)

Max_Var_Leaf_Size = Max_Var_Leaf_Size + 不在非聚集索引鍵列集中的可變長度聚集鍵列的字節(jié)大小(如果聚集索引不唯一,則加4)

說明:由于非聚集索引IND_name_STUDENT的鍵值不是唯一的(考慮現(xiàn)實(shí)中重名的情況),因此跳過二.2步驟,轉(zhuǎn)到二.3步驟。

3.計(jì)算空位圖大小:Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)對表達(dá)式向下取整,因此Leaf_Null_Bitmap = 2+((2+7)/8)=3.125≈3

4.計(jì)算可變長度數(shù)據(jù)大小:如果索引鍵中有可變長度的列(包括步驟二.2 中必要的聚集索引鍵列),確定其需要的存儲空間:Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols×2) + Max_Var_Leaf_Size此時我們假定頁的填滿度為100%。如果頁的填滿度低,可以按照比例調(diào)整Max_Var_Leaf_Size的值,從而對整個表大小得出一個更準(zhǔn)確的估計(jì)。如果沒有可變長度的列,則將 Variable_Leaf_Size 設(shè)置為 0。 本示例中Variable_Leaf_Size = 2+(1×2)+20=24 byte。

5.計(jì)算索引行大小: Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_

Bitmap + 1 (對應(yīng)于索引行的行標(biāo)題開銷)+ 6(對應(yīng)于子頁 ID 指針)=6+24+3+1=34 byte

6.計(jì)算每頁的索引行數(shù)(每頁可存儲8096個字節(jié)):Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)由于索引不能跨頁斷行,因此每頁的索引行數(shù)向下取整。公式中的數(shù)值2是計(jì)算行數(shù)時引入的行大小余量。本示例中Leaf_Rows_Per_Page = 8096/(34+2) ≈224 row

7.假定頁的填充因子并計(jì)算每頁保留的空行數(shù):Free_Rows_Per_Page = 8096×((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)注意:填充因子為整數(shù),不是百分比。由于索引不能跨頁斷行,因此每頁的行數(shù)向下取整。公式中的數(shù)值 2 是計(jì)算行數(shù)時引入的行大小余量。本示例中假定Fill_Factor為60,因此Free_Rows_Per_Page = 8096×((100-60)/100)/(34 + 2) ≈89 row。即每頁需保留89個空行。

8.計(jì)算存儲所有行所需的頁數(shù):Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_

Page)結(jié)果需向上取整。 本示例中Num_Leaf_Pages = 1,000,000/(224-89)=7408 page

9.計(jì)算葉級節(jié)點(diǎn)的空間大小(每頁可儲存 8192字節(jié)): Leaf_Space_Used = 8192×Num_Leaf_Pages=

8192×7408≈58MB

三、對從前面兩個步驟中得到的值求和

Nonclustered index size (bytes) = Leaf_Space_Used + Index_Space_used=2+58=60MB

通過計(jì)算可知,對于一個具有1,000,000條記錄的student表來說,我們創(chuàng)建一個非聚集索引IND_name_STUDENT(不唯一)時,SQL Server為存儲該索引所需要的存儲空間大約是60MB。相對于存儲表的空間,60MB的空間開銷是很小的,但它可以大大提升我們對“姓名”字段的查找速度。因此,為數(shù)據(jù)表中經(jīng)常需要查詢的字段或字段組合設(shè)計(jì)好非聚集索引,可以大大提高查詢效率。

一個表的空間大小是可估的,(1)若表無主鍵,則表大小=堆大小+非聚集索引大小;(2)有主鍵,則表大小=聚集索引大小+非聚集索引大小。表空間大小可估,數(shù)據(jù)庫的空間大小就可估了。因此給數(shù)據(jù)庫一個合理的初始大小是可行的也是必要的。

參考文獻(xiàn):

[1]岳莉.在SQL Server中估算堆大小[J].教育教學(xué)論壇,2013,5(22):146-147.

[2]Liyue.The Key Factors of Mathematical Formula Affecting the Size of a Clustered Index. Advanced Materials Research Vol.962-965(2014):2877-2880.

主站蜘蛛池模板: 制服丝袜在线视频香蕉| 亚洲一区二区三区中文字幕5566| 97人人模人人爽人人喊小说| 99久久国产综合精品2023| 一级爆乳无码av| 波多野结衣一区二区三区四区 | 五月天久久综合| 在线无码九区| 乱系列中文字幕在线视频| 精品一区二区三区视频免费观看| 四虎永久在线| 国产麻豆另类AV| 色丁丁毛片在线观看| 亚洲欧美一级一级a| 91久久国产综合精品女同我| 成人综合久久综合| 国产高颜值露脸在线观看| 永久成人无码激情视频免费| 一区二区三区四区日韩| 国产精品久久久久鬼色| 日本高清在线看免费观看| 精品色综合| 亚洲香蕉伊综合在人在线| 国产成人免费视频精品一区二区| 亚洲成网777777国产精品| 国产一区二区三区日韩精品| 国产激情影院| 亚洲无码高清视频在线观看| 精品视频福利| 九九免费观看全部免费视频| 国产鲁鲁视频在线观看| 欧美精品三级在线| 2020国产精品视频| 日本国产精品一区久久久| 久久精品人人做人人综合试看| 丝袜国产一区| 亚洲福利一区二区三区| 亚洲人成人无码www| 在线观看视频一区二区| 日韩美女福利视频| 四虎永久在线| 国产成人无码AV在线播放动漫| 无码国产偷倩在线播放老年人| 亚洲成人在线免费观看| 首页亚洲国产丝袜长腿综合| 黄色网站在线观看无码| 精品国产免费观看一区| 欧美特黄一级大黄录像| 欧美综合成人| 欧美日韩资源| 日本一区二区不卡视频| 免费午夜无码18禁无码影院| 女人av社区男人的天堂| 国产AV无码专区亚洲A∨毛片| 婷婷六月综合| 一区二区三区四区日韩| 狠狠v日韩v欧美v| 国产视频大全| 国产精品xxx| 久久久精品国产SM调教网站| 国产精品刺激对白在线| 久久综合丝袜日本网| 国产精品一区在线观看你懂的| 激情综合网址| 国产波多野结衣中文在线播放| 成人午夜亚洲影视在线观看| 日韩av手机在线| 欧美日韩一区二区三| 免费99精品国产自在现线| 在线国产91| 亚洲视频a| av在线人妻熟妇| 亚洲无码视频一区二区三区| 丁香五月婷婷激情基地| 国产精品19p| 国产成人永久免费视频| 亚洲第一成年人网站| 麻豆国产在线观看一区二区| 色网站在线免费观看| 亚洲国产一成久久精品国产成人综合| 毛片网站免费在线观看| 啪啪啪亚洲无码|