每隔一段時間,我們就需要在 Oracle 中重建索引,因為隨著時間流逝,索引會變成片段。這會導致索引的效能下降,進而資料庫查詢的效能也會下降。因此,不時重建索引會是有利的。話雖如此,索引不應該經常重建,因為這是一項資源密集型任務。更糟糕的是,當重建索引時,索引將被鎖定,從而封鎖任何人在重建期間存取它。嘗試存取該索引以傳回所需結果的所有查詢都將被暫時封鎖,直到重建完成為止。
在今天的文章中,我們將學習建立索引的頻率以及如何判斷何時需要重建索引。
重建索引的頻率
如引言中所述,重建索引既耗費資源又阻塞工作。因這兩方面的考慮,最理想是將使它變為離線活動,在存取資料庫的使用者盡可能少的情況下執行。通常,這意味著在排程的維護視窗內。
為何時以及多久重建一次索引制定一個全面的計劃實際上是不可行的。這些決定在很大程度上取決於你使用的資料類型以及所使用的索引和查詢。考慮到這一點,這裡有一些有關何時重建索引的準則:
- 每晚重建索引
如果索引迅速片段化,並且你有一個每晚執行的維護視窗,而該視窗除所有其他維護,工作之外,還允許執行重建索引工作,那麼請務必繼續。
- 至少每週執行一次
如果你不能每晚重建索引,則應至少每週執行一次。如果等待時間超過一週,則由於浪費的空白空間和邏輯片段而產生的負面影響,可能會減低 SQL Server 的效能。
- 交替排程
如果沒有維護視窗至少每週執行此工作一次,那麼你需要密切注意索引的執行情況。
判斷是否需要重建索引
在 Oracle 中,你可以使用 ANALYZE INDEX VALIDATE STRUCTURE 命令來了解索引的目前狀態。以下是 INDEX_STATS Table 資料表的一些範例輸出:
SQL> ANALYZE INDEX IDX_GAM_ACCT VALIDATE STRUCTURE; Statement processed. SQL> SELECT name, height,lf_rows,lf_blks,del_lf_rows FROM INDEX_STATS; NAME HEIGHT LF_ROWS LF_BLKS DEL_LF_ROW ------------- ----------- ---------- ---------- ---------- DX_GAM_ACCT 2 1 3 6 1 row selected.
有兩個經驗法則可以幫助判斷是否需要重建索引:
- 如果索引的高度大於四,則重建索引。
- 刪除的分葉列應少於 20%。
重建索引
在 Oracle 中,你可以使用 Alter Index Rebuild 命令來重建索引。它會重建空間索引或分割區索引的指定分割區。
ALTER INDEX REBUILD 命令有以下幾種形式:
ALTER INDEX [schema.]index REBUILD [PARAMETERS ('rebuild_params [physical_storage_params]' ) ] [{ NOPARALLEL | PARALLEL [ integer ] }] ;
或
ALTER INDEX [schema.]index REBUILD ONLINE [PARAMETERS ('rebuild_params [physical_storage_params]' ) ] [{ NOPARALLEL | PARALLEL [ integer ] }] ;
或
ALTER INDEX [schema.]index REBUILD PARTITION partition [PARAMETERS ('rebuild_params [physical_storage_params]' ) ];
處理無法使用的索引
Navicat for Oracle 的維護索引工具提供了兩個有用的選項來處理無法使用的索引:
- 重建
重新建立現有索引或其分割區或子分割區之一。如果索引標記為無法使用,則重建成功將標記它為可使用。
- 使無法使用
使索引無法使用。在使用無法使用的索引之前,必須重建、刪除或重新建立它。
總結
在今天的文章中,我們學習了建立索引的頻率以及如何判斷何時需要重建索引。
如果你想了解更多有關 Navicat for Oracle 的資訊,請前往產品頁面。