索引分為聚簇索引和非聚簇索引
1.聚簇索引/聚集索引
聚簇索引的順序就是數(shù)據(jù)的物理存儲順序,對于一個表來說,只有一個聚簇索引
create unique clustered index id_indexon table_1(id asc)with fillfactor=10 /*填充因子10%*/
2.非聚簇索引/非聚集索引
聚簇索引的順序跟數(shù)據(jù)的物理順序無關(guān),索引與數(shù)據(jù)存放在不同的物理區(qū)域,建立非聚簇索引時數(shù)據(jù)本身不進(jìn)行排序,一個表中可含多個非聚簇索引。
create nonclustered index id_datetimes_indexon table_1(id asc,datetimes asc)with fillfactor=10 /*填充因子10%*/
3.填充因子fillfactor
在創(chuàng)建聚集索引時,表中的數(shù)據(jù)按照索引列中的值的順序存儲在數(shù)據(jù)庫的數(shù)據(jù)頁中。在表中插入新的數(shù)據(jù)行或更改索引列中的值 時,可能必須重新組織表中的數(shù)據(jù)存儲,以便為新行騰出空間,保持?jǐn)?shù)據(jù)的有序存儲。這同樣適用于非聚集索引。添加或更改數(shù)據(jù)時,SQL Server 可能不得不重新組織非聚集索引頁中的數(shù)據(jù)存儲。向一個已滿的索引頁添加某個新行時,SQL Server 把大約一半的行移到新頁中以便為新行騰出空間。這種重組稱為頁拆分。頁拆分會降低性能并使表中的數(shù)據(jù)存儲產(chǎn)生碎片。有關(guān)更多信息,請參見表和索引構(gòu)架。 創(chuàng)建索引時,可以指定一個填充因子,以便在索引的每個葉級頁上留出額外的間隙和保留一定百分比的空間,供將來表的數(shù)據(jù)存儲容量進(jìn)行擴(kuò)充和減少頁拆分的可能 性。填充因子的值是從 0 到 100 的百分比數(shù)值,指定在創(chuàng)建索引后對數(shù)據(jù)頁的填充比例。值為 100 時表示頁將填滿,所留出的存儲空間量最小。只有當(dāng)不會對數(shù)據(jù)進(jìn)行更改時(例如,在只讀表中)才會使用此設(shè)置。值越小則數(shù)據(jù)頁上的空閑空間越大,這樣可以減 少在索引增長過程中對數(shù)據(jù)頁進(jìn)行拆分的需要,但需要更多的存儲空間。當(dāng)表中數(shù)據(jù)會發(fā)生更改時,這種設(shè)置更為適當(dāng)。 提供填充因子選項(xiàng)是為了對性能進(jìn)行微調(diào)。但是,使用 sp_configure 系統(tǒng)存儲過程指定的服務(wù)器范圍的默認(rèn)填充因子,在大多數(shù)情況下都是最佳的選擇?! ? 說明即使對于一個面向許多插入和更新操作的應(yīng)用程序來說,數(shù)據(jù)庫讀取次數(shù)一般也超過數(shù)據(jù)庫寫入次數(shù)的 5 到 10 倍。因此,指定一個不同于默認(rèn)設(shè)置的填充因子會降低數(shù)據(jù)庫的讀取性能,而降低量與填充因子設(shè)置值成反比。例如,當(dāng)填充因子的值為 50% 時,數(shù)據(jù)庫的讀取性能會降低兩倍。 只有當(dāng)在表中根據(jù)現(xiàn)有數(shù)據(jù)創(chuàng)建新索引,并且可以精確預(yù)見將來會對這些數(shù)據(jù)進(jìn)行哪些更改時,將填充因子選項(xiàng)設(shè)置為另一個值才有用。 填充因子只在創(chuàng)建索引時執(zhí)行;索引創(chuàng)建后,當(dāng)表中進(jìn)行數(shù)據(jù)的添加、刪除或更新時,不會保持填充因子。如果試圖在數(shù)據(jù)頁上保持額外的空間,則將有背于使用填 充因子的本意,因?yàn)殡S著數(shù)據(jù)的輸入,SQL Server 必須在每個頁上進(jìn)行頁拆分,以保持填充因子指定的空閑空間百分比。因此,如果表中的數(shù)據(jù)進(jìn)行了較大的變動,添加了新數(shù)據(jù),可以填充數(shù)據(jù)頁的空閑空間。在這 種情況下,可以重新創(chuàng)建索引,重新指定填充因子,以重新分布數(shù)據(jù)。
因此,一般設(shè)置的原則是數(shù)據(jù)變化較大,填充因子設(shè)較小值,而數(shù)據(jù)變化較小,填充因子設(shè)較大值。
新聞熱點(diǎn)
疑難解答
圖片精選