索引碎片整理 為什么sql server數(shù)據(jù)庫索引碎片整理?
為什么sql server數(shù)據(jù)庫索引碎片整理?本文需要您對(duì)SQL中數(shù)據(jù)的索引和存儲(chǔ)方法有一定的了解在SQL server中,存儲(chǔ)數(shù)據(jù)的最小單位是頁,每個(gè)頁可以容納8060字節(jié)的數(shù)據(jù)。頁面的組織是通過B
為什么sql server數(shù)據(jù)庫索引碎片整理?
本文需要您對(duì)SQL中數(shù)據(jù)的索引和存儲(chǔ)方法有一定的了解
在SQL server中,存儲(chǔ)數(shù)據(jù)的最小單位是頁,每個(gè)頁可以容納8060字節(jié)的數(shù)據(jù)。頁面的組織是通過B-樹結(jié)構(gòu)(如果表上沒有聚集索引,則為堆結(jié)構(gòu),本文不討論),如下圖所示:
在聚集索引B-樹中,只有葉節(jié)點(diǎn)實(shí)際存儲(chǔ)數(shù)據(jù),而其他根節(jié)點(diǎn)和中間節(jié)點(diǎn)各自僅用于存儲(chǔ)葉節(jié)點(diǎn)葉節(jié)點(diǎn)是一個(gè)頁,每個(gè)頁都是不可分割的,服務(wù)器在每個(gè)頁中存儲(chǔ)數(shù)據(jù)的最小單位是表的行。當(dāng)葉節(jié)點(diǎn)中新插入的行或更新的行不能容納當(dāng)前更新的行或插入的行時(shí),將進(jìn)行分頁。在分頁過程中,將生成片段。
了解外部片段
首先,了解外部片段的“外部”是相對(duì)于頁面的。外部碎片是指分頁引起的碎片。例如,我想在現(xiàn)有聚集索引中插入一行,這會(huì)導(dǎo)致現(xiàn)有頁面空間不足以容納新行。這會(huì)導(dǎo)致分頁:
因?yàn)樵赟QL server中,新頁面是隨著數(shù)據(jù)的增長而生成的,聚集索引需要行之間的連續(xù)性,所以在很多情況下,分頁和原始頁面在磁盤上是不連續(xù)的。
mongodb建立索引為什么不會(huì)產(chǎn)生索引碎片?
如果mongodb直接在前臺(tái)運(yùn)行index命令,整個(gè)數(shù)據(jù)庫都會(huì)被阻塞,建議采用后臺(tái)索引的方式建立。但是,這也會(huì)帶來一些問題。在2.6版本之前,即使二級(jí)服務(wù)器使用后臺(tái)模式建立索引,二級(jí)服務(wù)器仍然會(huì)以前臺(tái)模式建立索引,這也會(huì)導(dǎo)致數(shù)據(jù)庫阻塞問題。版本2.6修復(fù)了這個(gè)錯(cuò)誤。在版本2.6之后,當(dāng)使用后臺(tái)模式構(gòu)建索引時(shí),它實(shí)際上會(huì)轉(zhuǎn)向在后臺(tái)運(yùn)行。為了盡量減少索引構(gòu)建對(duì)mongodb服務(wù)器的影響,一種方法是將mongodb服務(wù)器轉(zhuǎn)換為單機(jī)模式并進(jìn)行構(gòu)建。具體步驟如下:
1。首先停止輔助服務(wù)器,取消--replset參數(shù)并更改mongodb端口后重新啟動(dòng)mongodb。此時(shí),mongodb將進(jìn)入標(biāo)準(zhǔn)模式;
2。運(yùn)行命令ensureindex以標(biāo)準(zhǔn)模式構(gòu)建索引,建議使用前臺(tái)模式;
3。建立索引后關(guān)閉輔助服務(wù)器,按正常方式啟動(dòng)服務(wù)器
4。按照上述步驟1-3依次建立二級(jí)索引。最后,臨時(shí)將主服務(wù)器轉(zhuǎn)換為輔助服務(wù)器。同樣,根據(jù)方法1-3構(gòu)建索引,然后將其轉(zhuǎn)換到主服務(wù)器。這種方法雖然麻煩,但可以最大限度地減少索引操作對(duì)mongodb的影響,在某些情況下值得做。