45-Oracle 索引的新建與重建

小伙們日常里有沒有被業務和BOSS要求新建索引或是重建索引?他們都想著既快又穩,那么索引在在Oracle上如何實現、新建、重建。原則是什么:

1、新建索引,查詢是否高頻且慢,索引列是否高選擇性,新增索引對寫負載的影響是否可接受。

2、重建索引,驗證碎片率/B樹高度是否超標,測試重建后查詢提升是否有15%以上呢。

一、?核心索引類型與原理?

B*Tree索引(默認)??
  • ?結構?:平衡樹(根節點→分支節點→葉子節點),葉子節點雙向鏈表存儲鍵值+ROWID?
  • ?查詢效率?:時間復雜度O(log n),千萬級數據定位僅需約23次比較
  • ?適用場景?:高基數列(比如EMPLOYEE_ID)、范圍查詢(比如SALARY > 10000)
位圖索引?
  • ?原理?:為每個鍵值創建位圖(0/1標識行存在性),通過位運算(AND/OR)加速組合查詢
  • ?適用場景?:低基數列(如GENDER)、OLAP系統
函數索引(Oracle 8i就開始引入)??
  • ?機制?:對列的函數結果建索引(如UPPER(LAST_NAME))

二、Oracle的index演進:重建機制對比

?1. 11g時代:基礎重建框架?
  • ?在線重建初現?:REBUILD ONLINE首次實現DML不阻塞,但首尾需毫秒級表鎖(LOCK TABLE IN EXCLUSIVE MODE)
  • ?資源消耗大?:并行處理需手動管理(PARALLEL n),臨時表空間易爆增(10億級索引排序易觸發multipass)
  • ?空間要求高?:需預留1.5倍原索引空間,否則引發ORA-01654
?2. 19c增強:穩定與自動化?
  • ?在線鎖優化?:
  • ?自治能力引入?:支持自動統計信息收集(DBMS_STATS.AUTO_GATHER),減少手動維護
  • ?熱重建支持?:RESUMABLE_TIMEOUT支持中斷恢復(如空間不足暫停)
?3. 23ai革新:AI驅動與智能治理?
  • ?向量索引革命?:新增VECTOR數據類型,支持AI語義搜索(需啟用vector pool內存區)
  • 自治重建升級?:當blevel≥4或碎片率>20%時,自動觸發重建(需開啟AUTO_INDEX_MAINTENANCE)
  • ?資源自適配?:OPTIMIZE_LOAD參數自動平衡I/O與CPU負載(NVMe環境性能提升40%)

三、新建索引方法與場景?

?1. 場景選擇與優化原則

單表索引數 ≤ 列數的20%,避免DML性能下降。小表無需索引,全表掃描更快?

?索引類型?

?適用場景?

?優化建議?

?B*Tree?

主鍵、外鍵、范圍查詢

避免在頻繁更新的列上創建

?位圖索引?

性別、狀態等低基數枚舉值

僅適用于OLAP,禁用OLTP

?復合索引?

多列組合查詢(如WHERE dept_id=10 AND job_id='IT_PROG')

第一列需被WHERE引用

?函數索引?

條件含表達式(如UPPER(last_name)='SMITH')

確保函數穩定性

2. 新建步驟(以HR.EMPLOYEES為例)?
-- 單列B*Tree索引(高頻查詢列)
CREATE INDEX IDX_EMP_DEPT_lastname ON employees(last_name);
--
SYS@CDB$ROOT> CREATE INDEX IDX_EMP_DEPT_lastname ON HR.employees(last_name);
Index IDX_EMP_DEPT_LASTNAME created.
-- 復合索引(多列查詢,高頻條件列在前)
CREATE INDEX IDX_EMP_DEPT_dept ON HR.employees(EMPLOYEE_id,department_id);-- 位圖索引(低基數列)
ALTER TABLE HR.EMPLOYEES ADD (gender int);--官方schema的sql中建表無性別
CREATE BITMAP INDEX IDX_EMP_DEPT_gender ON HR.employees(gender);

四、索引重建策略與實戰分析(以HR.EMPLOYEES為例)??

?1. 重建前提與評估?
  • ?觸發條件?:
    • 索引高度 ≥4(SELECT blevel FROM dba_indexes WHERE index_name='IDX_EMP_DEPT_DEPT';)
    • 碎片率 >20%(ANALYZE INDEX idx_name VALIDATE STRUCTURE;?→?SELECT DEL_LF_ROWS/LF_ROWS FROM index_stats;)
    • 表頻繁發生UPDATE/DELETE(如HR.EMPLOYEES的歷史數據清理)?
?2. 重建實操流程
-- 步驟1:分析碎片率
ANALYZE INDEX IDX_EMP_DEPT_dept VALIDATE STRUCTURE;
SELECT name, height, DEL_LF_ROWS/LF_ROWS AS frag_ratio FROM index_stats;
-- 若frag_ratio>0.2則需重建
SYS@CDB$ROOT> ANALYZE INDEX IDX_EMP_DEPT_DEPT VALIDATE STRUCTURE;
Index IDX_EMP_DEPT_DEPT analyzed.
NAME               HEIGHT    FRAG_RATIO
_______________ _________ _____________
IDX_EMP_DEPT_DEPT            1             0-- 步驟2:在線重建(避免阻塞DML)
ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE TABLESPACE HR_data;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE TABLESPACE HR_data;
Index IDX_EMP_DEPT_DEPT altered.-- 步驟3:驗證效果  
-- 檢查是否走索引
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id=60;ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE;
Index IDX_EMP_DEPT_DEPT altered.--遷移索引位置:TABLESPACE從HR_DATA 索引重建到SH_data
ALTER INDEX IDX_EMP_DEPT_DEPT REBUILD TABLESPACE SH_DATA;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_DEPT REBUILD TABLESPACE SH_DATA;
Index IDX_EMP_DEPT_DEPT altered.--性能優化參數?PARALLEL n**?啟用并行進程(建議值為CPU核數50%-70%)
ALTER INDEX IDX_EMP_DEPT REBUILD PARALLEL 8;--STORAGE**?調整物理存儲屬性(需在重建前規劃)
ALTER INDEX IDX_EMP_DEPT REBUILD STORAGE (INITIAL 100M NEXT 50M);--COMPRESS ADVANCED啟用高級壓縮減少空間占用
ALTER INDEX IDX_EMP_DEPT REBUILD COMPRESS ADVANCED;

五、典型異常與解決方案

1. ?重建失敗索引失效(ORA-01502)??

?現象?:索引狀態變為UNUSABLE,查詢報錯ORA-01502,表空間遷移或手動禁用索引后未重建

-- 檢查失效索引
SELECT index_name, status FROM dba_indexes WHERE status='UNUSABLE';-- 重建失效索引
ALTER INDEX IDX_EMP_DEPT REBUILD;
2. ?空間不足(ORA-01654)??

?預防?:重建前檢查表空間,規則?:所需空間 ≈ 原索引大小的1.2倍

SELECT tablespace_name, SUM(bytes)/1024/1024 free_space_mb 
FROM dba_free_space 
GROUP BY tablespace_name;
3. 碎片DBMS包診斷
--基礎調用(僅收集索引統計),注意OWNNAME 哪個用戶建的
BEGINDBMS_STATS.GATHER_INDEX_STATS(ownname => 'SYS',indname => 'IDX_EMP_DEPT_dept');
END;
/
--擴展參數(采樣率 + 并行度)
BEGINDBMS_STATS.GATHER_INDEX_STATS(ownname          => 'SYS',indname          => 'IDX_EMP_DEPT_dept',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自動采樣degree           => 4  -- 并行度(建議≤CPU核數));
END;
/
-- 23ai支持JSON輸出診斷報告
ANALYZE INDEX emp_name_idx VALIDATE STRUCTURE;
SELECT name, height, ROUND((del_lf_rows/NULLIF(lf_rows,0))*100,2) frag_pct 
FROM index_stats;
4. 重建后必做操作?
  • ?ORA-08104 殘留中斷
DECLAREisClean BOOLEAN;
BEGIN-- 使用有效參數名,且不傳遞 cleanup_levelisClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(OBJECT_ID => DBMS_REPAIR.ALL_INDEX_ID,  -- 清理所有中斷索引WAIT_FOR_LOCK => DBMS_REPAIR.LOCK_WAIT    -- 默認鎖等待策略);
END;
/
--PL/SQL procedure successfully completed.
  • 指定OBJECT_ID修復?
DECLAREisClean BOOLEAN;v_index_id NUMBER := 68100; -- 替換為實際索引的OBJECT_ID(從DBA_OBJECTS查詢)
BEGINisClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(v_index_id);
END;
/
---若表上有活躍DML操作,函數可能因無法獲取鎖而返回FALSE。此時需檢查鎖競爭
SELECT sid, serial# 
FROM v$session 
WHERE sid IN (SELECT session_id FROM dba_locks WHERE object_id = <索引ID>);

、索引生命周期中索引影響與風險控制?

  • ?性能收益?: I/O降低:碎片整理后邏輯讀減少30%~70%
  • 查詢加速:索引高度從4降至2,定位效率提升50%
  • ?風險規避?: ?資源占用?:重建過程消耗CPU/IO,需在業務低峰操作
  • ?日志壓力?:生成大量Redo日志,確保UNDO_RETENTION足夠?
  • ?創建階段?:按查詢模式精準設計,復合索引列順序是關鍵
  • ?維護階段?:
    • 定期監控DBA_INDEXES的BLEVEL和LF_ROWS
    • 優先選擇 ?**REBUILD ONLINE**? 減少業務中斷
  • ?重建黃金法則?:?“不碎不建”??:僅當碎片率>20%或高度≥4時重建,避免過度維護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Rust Clippy 的詳細方案

使用 Rust Clippy 的詳細方案 Rust Clippy 是一個強大的靜態分析工具&#xff0c;幫助開發者識別代碼中的潛在問題并改善代碼質量。以下是如何充分利用 Clippy 的方法&#xff1a; 安裝 Clippy 確保 Rust 工具鏈已安裝。通過以下命令安裝 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native與H5交互的常用交互機制&#xff0c;主流選擇是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 項目方&#xff08;或三方庫&#xff09;封裝的橋梁通信協議。 底層機制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一體的大數據處理引擎 什么是Apache Flink&#xff1f; Apache Flink是一個開源的分布式流處理框架&#xff0c;最初由柏林工業大學開發&#xff0c;后成為Apache軟件基金會的頂級項目。它能夠以高吞吐、低延遲的方式處理無界數據流(流處理)和有…

區塊鏈+智能合約如何解決上門按摩行業的信任問題?——App開發案例

你是不是覺得上門按摩市場已經人滿為患&#xff1f;擔心自己入局太晚或者缺乏行業經驗&#xff1f;一組真實數據可能會讓你改變看法&#xff1a;全國按摩服務需求正以月均8%的速度迅猛增長&#xff0c;但專業技師的供給量僅能跟上5%的增幅&#xff01;這意味著每個月都有相當于…

修改windows hosts文件的軟件

修改hosts文件的軟件推薦及使用教程 這個軟件我用了10多年 推薦工具&#xff1a;Hosts Host軟件不用安裝綠色 如何使用 注意事項 如何沒有安裝.net 3.5 請根據提示安裝就可以了 內容綁定了軟件下載資源&#xff0c;在頂部有需要的自己取

Java web非Maven項目中引入EasyExcel踩坑記錄

最近在幫朋友在老項目上做二次開發&#xff0c;有讀取Excel的需求&#xff0c;習慣性的引入了EasyExcel&#xff0c;但是出現了很多問題&#xff0c;最主要就是jar包的問題,需要依賴的jar包版本問題 項目技術棧&#xff1a; tomcat9 Amazon Corretto JDK 8 (亞馬遜的openJDK…

Flutter——數據庫Drift開發詳細教程(七)

目錄 入門設置 漂移文件入門變量數組定義表支持的列類型漂移特有的功能 導入嵌套結果LIST子查詢Dart 互操作SQL 中的 Dart 組件類型轉換器現有的行類Dart 文檔注釋 結果類名稱支持的語句 入門 Drift 提供了一個dart_api來定義表和編寫 SQL 查詢。尤其當您已經熟悉 SQL 時&#…

【排坑指南】MySQL初始化后,Nacos與微服務無法連接??

Date&#xff1a;2025/06/18 你好&#xff01; 今天&#xff0c;分享一個工作中遇到的一個 MySQL 問題。在這之前都不知道是 MySQL 的問題&#xff0c;特離譜&#xff01; 昨天和今天大多數時間都用來處理了這一個問題&#xff1a;《MySQL進行了數據庫初始化之后&#xff0c…

springboot獲取工程目錄

在springboot中使用ApplicationHome獲取工程所在目錄的時候&#xff0c;開發環境和生產運行環境輸出的目錄是不同的&#xff0c;開發環境到target/classes目錄&#xff0c;而生產運行則是需要的wzkj-server.jar所在目錄 ApplicationHome home new ApplicationHome(CollectTas…

深入ZGC并發處理的原理

大型Java應用的核心痛點之一&#xff1a;當JVM進行垃圾回收時強制程序暫停&#xff08;STW&#xff09;的代價。在要求低延遲的應用場景——高頻交易系統、實時在線服務或全球性大型平臺——中&#xff0c;這種"時空靜止"的成本可能極高。但JDK從16版本&#xff08;生…

配置DHCP服務(小白的“升級打怪”成長之路)

目錄 項目前準備 一、DHCP服務器配置&#xff08;Rocky8&#xff09; 1&#xff0c;關閉防火墻、安全上下文 2、配置網卡文件 3、安裝hdcp-server 4、配置dhcp服務 5、重啟dhcp服務 二、配置路由器 1、添加兩塊網卡并更改網卡配置文件 2、配置路由功能 3、掛載本地鏡…

云原生安全

云原生 | T Wiki 以下大部分內容參考了這篇文章 什么是云原生 云原生&#xff08;Cloud Native&#xff09; “云原生”可以從字面上拆解為“云”和“原生”兩個部分來理解&#xff1a; “云”&#xff0c;是相對于“本地”而言的。傳統應用部署在本地數據中心或物理服務器…

rapidocr v3.2.0發布

粗略更新日志 rapidocr v3.2.0 發布了。令我感到很開心的是&#xff1a;有 3 個小伙伴提了 PR&#xff0c;他們積極參與了進來。 更新要點如下&#xff1a; 采納了小伙伴qianliyx 的建議&#xff0c;按照行返回單字坐標&#xff1a;同一行的單字坐標是在同一個 tuple 中的。…

Java 操作數類型沖突: varbinary 與 real 不兼容, Java中BigDecimal與SQL Server real類型沖突解決方案

要解決Java中BigDecimal類型與SQL Server中real類型沖突導致的varbinary與real不兼容錯誤&#xff0c;請按以下步驟操作&#xff1a; 錯誤原因分析 類型映射錯誤&#xff1a;JDBC驅動嘗試將BigDecimal轉換為varbinary&#xff08;二進制類型&#xff09;&#xff0c;而非目標字…

25.多子句查詢

MySQL 中包含 GROUP BY、HAVING、ORDER BY、LIMIT 時的查詢語法規則及應用&#xff0c;核心知識總結如下&#xff1a; 1.語法順序規則 當 SELECT 語句同時包含 GROUP BY、HAVING、ORDER BY、LIMIT 時&#xff0c;執行順序為&#xff1a; GROUP BY → HAVING → ORDER BY → L…

Vue3 × DataV:三步上手炫酷數據可視化組件庫

DataV&#xff08;kjgl77/datav-vue3&#xff09;是專為“大屏可視化”場景打造的 Vue3 組件庫&#xff0c;提供邊框、裝飾、等數十個開箱即用的視覺組件。本文聚焦 “在 Vue3 項目中如何正確使用 DataV”&#xff0c;從安裝、全局注冊到常見坑點&#xff0c;帶你迅速玩轉這款酷…

本地KMS服務器激活常用命令

OpenWRT內置了KMS激活的相關服務&#xff0c;配置后需要電腦本地切換到該KMS服務。相關命令如下&#xff1a; 基本功能與定義? slmgr是Windows內置的軟件授權管理工具&#xff0c;全稱為Software License Manager。其核心功能包括產品密鑰安裝/卸載、許可證信息查詢、KMS服務器…

存貨核算:個別計價法、先進先出法、加權平均法、移動加權平均法解讀

存貨作為企業資產的重要組成部分&#xff0c;貫穿于企業運營的各個環節&#xff0c;特別是制造業&#xff0c;企業的所有運營體系都是圍繞存貨來開展的。根據會計準則&#xff0c;存貨是指企業在日常活動中持有以備出售的產成品或商品、處在生產過程中的在半成品&#xff0c;以…

Java異步編程:挑戰、實踐與未來

&#x1f4cc; 摘要 在現代高并發、高性能的系統中&#xff0c;異步編程已經成為構建響應式應用的重要手段。Java 提供了多種異步編程模型&#xff0c;從最基礎的 Future 和線程池&#xff0c;到 CompletableFuture 的鏈式調用&#xff0c;再到反應式框架如 Project Reactor 和…

哈希函數結構:從MD到海綿的進化之路

一、MD結構&#xff1a;哈希函數的經典范式 1. Merkle-Damgrd結構核心原理 #mermaid-svg-BX4ZrTendXiyIVr0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BX4ZrTendXiyIVr0 .error-icon{fill:#552222;}#mermaid-s…