什么情況下需要重建索引
都和碎片有關系,總結就是一高(高於20%)一低(低於75%),高不成低不就
1.碎片總計過高
參考值→碎片.碎片總計 > 20%
2.碎片填充度過低
參考值→碎片.頁填充度 < 75%
導致頁填充度過低的可能原因:
[
"1.有刪除",
"2.有分區表",
"3.聚集索引不是數字",
"4.數據比較少(百萬以內)"
]
[注意.缺少一張圖]
重建索引
ALTER INDEX <name of index> ON <table or view name>
REBUILD WITH (ONLINE = ON,MAXDOP = 4)
{
"ONLINE":
{
"描述":"是否在線執行",
"ON":"在線執行,減少重建過程中的鎖(執行時間延長)",
"OFF":"離線執行"
},
"MAXDOP":
{
"描述":"手動配置用於運行索引語句的最大處理器數",
"0":"指定服務器根據當前系統工作負荷確定所使用的 CPU 數目.這是默認值,還是推薦設置",
"1":"取消生成並行計划,操作將以串行方式執行",
"2~64":"將處理器的數量限制為指定的值.根據當前工作負荷,可能使用較少的處理器.如果指定的值大於可用的CPU數量,將使用實際可用的CPU數量"
}
}
--查找碎片率大於40
SELECT
object_name(object_id),
index_type_desc,
alloc_unit_type_desc,
avg_fragmentation_in_percent,
fragment_count,
avg_fragment_size_in_pages,
page_count,
record_count,
avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID('DBNAME'),OBJECT_ID(''),NULL,NULL,'Sampled')
WHERE avg_fragmentation_in_percent>40
Sqlserver數據庫的好多設置我們都忽略了,
我們日常只是更多的在寫SQL語句,
我們可以考慮下升級我們的Sqlserver數據庫版本,
優化我們的SQL語句,
深挖在這些SQL語句深處的一些低層知識.
擴展:
- 碎片怎么產生&碎片如何影響到了索引的價值,導致了要重建索引(不破不立)等
→博客園.T-SQL查詢高級—SQL Server索引中的碎片和填充因子 - 重建索引分需要幾步
第一個階段為新索引簡單夠造一顆空B+樹...
第二階段包括由掃描表來獲得每行的索引列,對行排序並將它們插入新的B+樹中...
最后階段涉及更新目錄以示索引創建已經完成,且索引對查詢是可用的.
- ...
各個情況
- 在線創建索引Vs離線創建索引
- 創建索引的時候.表已經存在數據Vs表還沒有數據
參考文檔
- 博客園.MSSQL 重建索引
- [數據庫系統概念.第30章]