SQL Server【提高】碎片
碎片
當(dāng)對索引所在的基礎(chǔ)數(shù)據(jù)表進(jìn)行增刪改時,若存儲的數(shù)據(jù)進(jìn)行了不適當(dāng)?shù)目珥摚⊿QL Server中存儲的最小單位是頁,頁是不可再分的),就會導(dǎo)致索引碎片的產(chǎn)生。
-
外部碎片
插入的數(shù)據(jù)使頁與頁之間造成斷續(xù),比如,插入的數(shù)據(jù)正好在頁中最后一行,被擠出到別的頁的數(shù)據(jù),與原來的頁之間沒有了連續(xù),這后果就嚴(yán)重了,這種情況就是外部的碎片。
-
內(nèi)部碎片
當(dāng)索引頁沒有用到最大量時就產(chǎn)生了內(nèi)部碎片。
碎片處理
- 查看表空間碎片化的一些統(tǒng)計信息
dbcc showcontig
use ${數(shù)據(jù)庫名}
dbcc showcontig with all_indexes
--查看指定表的所有索引的碎片信息
dbcc showcontig (${表名}) with all_indexes
--查看指定表、指定索引的碎片信息
dbcc showcontig (${表名},${索引名})
統(tǒng)計腳本
select
db_name() as dbname,
t.name as tablename,
s.name as schemaname,
p.rows as rowcounts,
sum(a.total_pages) * 8 as totalspacekb,
cast(round(((sum(a.total_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as 總共占用空間mb,
sum(a.used_pages) * 8 as 總使用空間kb,
cast(round(((sum(a.used_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as 總使用空間mb,
(sum(a.total_pages) - sum(a.used_pages)) * 8 as 碎片化空間kb,
cast(round(((sum(a.total_pages) - sum(a.used_pages)) * 8) / 1024.00, 2) as numeric(36, 2)) as 碎片化空間mb
from
sys.tables t
inner join
sys.indexes i on t.object_id = i.object_id
inner join
sys.partitions p on i.object_id = p.object_id and i.index_id = p.index_id
inner join
sys.allocation_units a on p.partition_id = a.container_id
left outer join
sys.schemas s on t.schema_id = s.schema_id
where
t.is_ms_shipped = 0
and i.object_id > 0
group by
t.name, s.name, p.rows
order by
總共占用空間mb desc
-
刪除索引并重建
-
使用DROP_EXISTING語句重建索引
-
使用ALTER INDEX REBUILD重新生成索引。(推薦)
-
使用ALTER INDEX REORGANIZE重新組織索引。(推薦)

REBUILD和Reorganize區(qū)別
Rebuild 是重新創(chuàng)建,將Index之前占用的空間釋放,重新申請空間來創(chuàng)建index
Reorganize 是重新組織,將index的葉子節(jié)點(diǎn)進(jìn)行重新組織
浙公網(wǎng)安備 33010602011771號