Oracle為數據大表創建索引方案

在日常業務中,避免不了為數據量大表補充創建索引的情況,如果快速、有效地創建索引成了一個至關重要的問題(注意:雖然提供有ONLINE在線執行的方式,理想狀態下不會阻塞DML操作,但ONLINE在開始、結束的兩個時刻仍然會產生獨占鎖,只是中間執行過程中才以共享鎖的模式掃描表,建議還是在業務低峰期操作,避免在執行窗口期高并發造成死鎖)。但對于超大量的,如TB級別的表,建議重新新建一個表,創建對應索引,將數據遷移,最后變更表名處理,不建議在原表上直接操作。

ONLINE 索引創建的內部簡化流程

  1. 準備階段 (非常短暫)

    • 對表施加一個低級別的獨占鎖(TM?鎖,模式為?SSX)以準備構建工作。這個鎖允許其他會話進行查詢(SELECT)和大部分DML操作,但會阻止其他DDL操作(如另一個CREATE INDEXALTER TABLE)。這個階段非常快。

  2. 掃描和構建階段 (主要耗時階段)

    • 這是?ONLINE?的關鍵:Oracle 以共享模式 (S鎖)?掃描表。共享鎖與DML操作的排他鎖(X鎖)是兼容的。這意味著:

      • 會話A可以持有共享鎖來掃描表以構建索引。

      • 會話B可以同時持有排他鎖來更新某一行。

    • 在此階段,Oracle會創建一個臨時日志表(Journal Table),用于記錄在索引構建開始后發生的、對相關數據的任何DML操作。

  3. 應用增量階段 (合并變更)

    • 索引主體結構構建完成后,Oracle會讀取臨時日志表中的記錄,并將這些在構建期間發生的DML變更(增、刪、改)應用到新索引上。

  4. 最終切換階段 (非常短暫)

    • 對新索引和表施加一個短暫的獨占鎖(X鎖),執行一個原子操作,將新索引正式投入使用并使其對優化器可見。這個鎖的持有時間極短,通常以毫秒計。

第一步:準備工作

除了預防死鎖,還應確保有足夠的資源(I/O、CPU)?來讓這個操作快速完成。

  1. 選擇維護窗口

    • 盡管是在線操作,但高并發期間仍會消耗大量CPU和I/O資源,可能影響業務性能。強烈建議在業務低峰期(如夜間、周末)執行

  2. 評估空間和估算大小

    • 索引大小通常取決于索引列的長度和數量。您可以運行以下查詢進行粗略估算(將<table>替換為表名,<owner>替換為表用戶):

    sql

    -- 查看表當前占用空間,表空間不夠的話最好先增加表空間
    SELECT SEGMENT_NAME, BYTES/1024/1024 AS SIZE_MB
    FROM DBA_SEGMENTS A
    WHERE A.SEGMENT_NAME = UPPER('<table>')
    AND A.OWNER=UPPER('<owner>');
    • 根據表大小,為索引預留至少相當于表大小20%-30%?的額外表空間。

  3. 確定并行度 (PARALLEL)

    • 對于中上大小的數據量,像近6000萬的數據,使用并行非常有效。一個合理的起始點是服務器CPU核數的一半

    • 例如,如果服務器有16個CPU核心,可以從PARALLEL 8開始。

    • 重要:創建完成后必須將并行度改回,否則會影響后續查詢的穩定性。

  4. 決定是否使用NOLOGGING

    • NOLOGGING可以大幅提升速度,因為它幾乎不生成重做日志。

    • 風險:如果索引創建后、下一次備份前數據庫發生故障,此索引可能會被標記為無效,需要重建。

    • 建議在維護窗口內,強烈建議使用NOLOGGING。完成后可以立即改回LOGGING模式。如果您的數據庫處于歸檔模式且備份策略完善,這個風險是可控的。


第二步:執行腳本

將以下腳本中的占位符替換為您的實際信息:

  • [INDEX_NAME]:新索引的名稱(如:IDX_XXXXXXX

  • [TABLE_NAME]:表名

  • [COLUMN_LIST]:索引列(如:col1, col2

  • [TABLESPACE_NAME]:索引所在的表空間(可選,如果不指定則使用用戶的默認表空間)

  • [PARALLEL_DEGREE]:并行度(如:8

執行腳本如下:

sql

-- 1. 可選:開啟會話級并行,確保命令生效
ALTER SESSION ENABLE PARALLEL DDL;-- 2. 核心:創建索引( ONLINE 和 PARALLEL 是關鍵)
CREATE INDEX [OWNER.][INDEX_NAME] ON [OWNER.][TABLE_NAME] ([COLUMN_LIST])
TABLESPACE [TABLESPACE_NAME]  -- 可選,指定表空間
ONLINE                         -- 關鍵!允許并發DML,防止鎖等待和死鎖
PARALLEL [PARALLEL_DEGREE]     -- 關鍵!加速創建,例如 PARALLEL 8
NOLOGGING;                     -- 關鍵!大幅提升速度。評估風險后使用-- 3. 創建完成后,立即將索引的并行度改回 1(或NONE),避免后續查詢過度并行
ALTER INDEX [OWNER.][INDEX_NAME] NOPARALLEL;-- 4. 可選但建議:如果使用了NOLOGGING,將其改回LOGGING模式,確保后續變更被安全記錄
ALTER INDEX [OWNER.][INDEX_NAME] LOGGING;-- 5. 收集新索引的統計信息(非常重要,否則優化器無法有效使用索引)
BEGINDBMS_STATS.GATHER_INDEX_STATS(OWNNAME => '[OWNER]',           -- 所屬用戶INDNAME => '[INDEX_NAME]',ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE -- 讓ORACLE自動決定采樣比例);
END;
/

第三步:驗證

  1. 檢查索引狀態

    sql

    SELECT INDEX_NAME, STATUS, VISIBILITYFROM DBA_INDEXES AWHERE A.INDEX_NAME = UPPER('[INDEX_NAME]')AND A.OWNER = UPPER('[OWNER]');
    
    • 確認?STATUS?為?VALID

    • 確認?VISIBILITY?為?VISIBLE(表示優化器可以使用它)。

  2. 檢查索引段大小

    sql

    SELECT SEGMENT_NAME, BYTES / 1024 / 1024 AS SIZE_MBFROM DBA_SEGMENTS AWHERE A.SEGMENT_NAME = UPPER('[INDEX_NAME]')AND A.OWNER = UPPER('[OWNER]');
    

    這可以讓你了解索引的實際大小。

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

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

相關文章

網站服務相關問題

目錄 HTTP常見的狀態碼 http和https的區別以及使用的端口號 http處理請求的過程 https認證過程 正向代理和反向代理的區別 HTTP常見的狀態碼 HTTP&#xff08;超文本傳輸協議&#xff09;定義了一系列的狀態碼&#xff0c;用于表示客戶端請求的處理結果。以下是一些常見的…

Go并發編程實戰:深入理解Goroutine與Channel

Go并發編程實戰&#xff1a;深入理解Goroutine與ChannelGo并發編程實戰&#xff1a;深入理解Goroutine與Channel概述1. 為什么是Go的并發&#xff1f;從“線程”與“協程”說起2. Goroutine&#xff1a;如何使用&#xff1f;3. Channel&#xff1a;Goroutine間的安全通信創建與…

2025服貿會“海淀之夜”,點亮“科技”與“服務”底色

2025年9月12日傍晚&#xff0c;北京頤和園&#xff0c;十七孔橋旁&#xff0c;2025年中國國際服務貿易交易會“海淀之夜”如約而至。在“海淀之夜”&#xff0c;科技機構、金融機構、咨詢服務機構、出海服務企業以及跨國企業和國際友人等&#xff0c;將目光聚焦于此。被第三方機…

qt使用camke時,采用vcpkg工具鏈設置VTK的qt模塊QVTKOpenGLNativeWidget

下載:QVTKOpenGLNativeWidget嵌入qt應用中資源-CSDN下載 1.通過vcpkg安裝VTK,目前的VTK里面默認為qt6,如果需要安裝qt5,需要將端口配置進行修改 筆者的vcpkg的vtk端口路徑:D:\vcpkg\ports\vtk portfile.cmake 修改點: #第一處 #file(READ "${CURRENT_INSTALLED_DIR}/sh…

Axios在鴻蒙應用開發中的使用

目錄一、簡介二、安裝與配置三、axios用法1.axios泛型參數(1).第三個泛型參數-約束data請求參數的類型(2).第二個泛型參數-決定后臺返回數據的類型2.axios攔截器3.請求工具封裝統一處理業務狀態碼錯誤統一處理401或404錯誤一、簡介 Axios 是一個基于 Promise 的網絡請求庫&…

第九周文件上傳

文件上傳漏洞 不同的網站要不同的webshell。我們使用是php開發的網站。 一服務器白名單繞過 服務端白名單(Whitelist)是?種安全機制&#xff0c;它只允許預定義的合法元素通過&#xff08;只有有限的元素進入&#xff09;&#xff0c;其他所有內容默認被拒絕。相比黑名單&am…

計算機視覺必讀論文:從經典到前沿

計算機視覺必讀論文:從經典到前沿 一、前言 二、經典論文解讀? 2.1 圖像分類? 2.1.1 《ImageNet Classification with Deep Convolutional Neural Networks》(AlexNet)? 2.1.2 《Very Deep Convolutional Networks for Large-Scale Image Recognition》(VGGNet)? 2.1.…

對比PowerBI的字段參數,QuickBI的已選字段還有改進的空間

對比PowerBI的字段參數&#xff0c;QuickBI的已選字段還有改進的空間 之前分享過QuickBI的已選字段 vs PowerBI的字段參數&#xff0c;QuickBI可以在表格中實現PowerBI的字段參數效果&#xff0c;甚至比PowerBI實現的過程和使用方式更絲滑。 但如果應用到圖形中會怎么樣呢&am…

飛算JavaAI:Java開發新時代的破曉之光

免責聲明&#xff1a;此文章的所有內容皆是本人實驗測評&#xff0c;并非廣告推廣&#xff0c;并非抄襲。如有侵權&#xff0c;請聯系&#xff0c;謝謝&#xff01;【#飛算JavaAl炫技賽】 【#Java開發】摘要&#xff1a;飛算JavaAI作為全球首款聚焦Java的智能開發助手&#xff…

vulntarget-c靶場內網滲透

1. 環境搭建 2.對ubuntu20的滲透 對其進行端口掃描 訪問80端口 發現是laravel框架。版本是v8.78.1 使用 kaili 自帶的msf 進行滲透 search laravel use exploit/multi/php/ignition_laravel_debug_rce執行利用完成檢測 上傳木馬 先將木馬進行base64編碼 <?php eval($_P…

基于大模型多模態的人體體型評估:從“尺碼測量”到“視覺-感受”范式

基于大模型多模態的人體體型評估&#xff1a;從“尺碼測量”到“視覺-感受”范式摘要&#xff1a;傳統體型識別依賴CV骨架/關鍵點與像素量尺&#xff0c;容易受衣物、發型、姿態、光照影響&#xff0c;且“厘米級數值”與穿衣體驗、審美感受之間存在鴻溝。本文提出一種基于大模…

【docker】——docker國內可用的源

不知道哪里來的&#xff0c;但是可以用。1. 解決方案打開配置文件&#xff08;若文件不存在&#xff0c;會自動創建&#xff09; sudo vim /etc/docker/daemon.json將以下內容粘貼進去{"builder": {"gc": {"defaultKeepStorage": "20GB&quo…

【Windows端口管理】快速查看和釋放被系統保留的TCP端口

問題描述在Windows系統開發時&#xff0c;經常遇到端口無法使用的問題。系統會自動保留一系列TCP/UDP端口范圍&#xff0c;導致應用程序無法綁定這些端口。查看所有被保留的端口范圍查看TCP保留端口# 查看所有TCP端口排除范圍 netsh interface ipv4 show excludedportrange pro…

面經匯總(1)

1.介紹C面向對象的三大特性2.介紹常見的排序算法3.介紹TCP/UDP區別4.TCP三次握手四次揮手5.如果四次揮手第四次客戶端的ACK沒有發出去會有什么結果&#xff1f;6.介紹MYSQL的事務7.介紹線程池8.主要的線程池有哪幾種&#xff1f;9.手撕反轉鏈表10.介紹對象存儲以及常見的對象存…

遙感圖像數字水印系統優化方案

遙感圖像數字水印系統優化方案 1. 引言 遙感圖像在現代地理信息系統、環境監測、軍事偵察等領域發揮著重要作用。為了保護遙感圖像的版權和完整性&#xff0c;數字水印技術被廣泛應用。然而&#xff0c;現有的遙感圖像水印方案往往在不可見性、魯棒性和容量之間存在權衡&#x…

鴻蒙高效數據處理框架全攻略:緩存、并行與流式實戰

摘要 在如今的物聯網和智能設備世界里&#xff0c;數據已經成為最關鍵的資源。無論是可穿戴設備、智能家居&#xff0c;還是車載系統&#xff0c;每一秒都會產生大量數據。如果缺少一套高效的數據處理框架&#xff0c;開發者就可能面臨內存溢出、處理延遲大、設備卡頓等問題。本…

零售企業數字化轉型的道、法、術:基于開源AI大模型AI智能名片S2B2C商城小程序的戰略重構

摘要 在數字經濟與消費升級的雙重驅動下&#xff0c;零售企業正經歷從"流量爭奪"到"用戶時間爭奪"的范式轉變。本文以阿里巴巴、京東、萬達三大巨頭的戰略實踐為樣本&#xff0c;結合開源AI大模型、AI智能名片與S2B2C商城小程序的技術特性&#xff0c;提出…

瑞云渲染為電影《731》提供云渲染技術支持,助力影片全球上映

在“九一八事變”94周年這一莊嚴沉重的紀念時刻&#xff0c;抗戰電影《731》&#xff08;海外名&#xff1a;《EVIL UNBOUND》&#xff09;于世界各地上映&#xff0c;激起廣泛的社會反響與深遠的歷史思考。 瑞云渲染&#xff08;Renderbus&#xff09;作為全球領先的云渲染服…

EasyDSS視頻直播RTMP推流技術如何實現多機型的無人機視頻統一直播

在當今這個瞬息萬變的傳媒時代&#xff0c;無人機與推流直播的結合&#xff0c;正以前所未有的方式重塑著信息傳播的邊界。無人機以其獨特的空中視角和靈活的機動性&#xff0c;為直播行業帶來了革命性的變化&#xff0c;而推流直播技術的成熟&#xff0c;則讓這一變化得以實時…

str.maketrans() 方法

str.maketrans() 方法 功能概述 str.maketrans() 是 Python 中字符串對象的一個靜態方法&#xff0c;用于創建一個字符映射轉換表。這個轉換表本質上是一個字典&#xff0c;它定義了字符之間的替換規則&#xff0c;后續可以被 str.translate() 方法使用&#xff0c;以實現字符串…