如果你管理的Oracle數(shù)據(jù)庫下某些應(yīng)用項(xiàng)目有大量的修改刪除操作 數(shù)據(jù)索引是需要周期性的重建的
10多年的興賓網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整興賓建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“興賓網(wǎng)站設(shè)計(jì)”,“興賓網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
它不僅可以提高查詢性能 還能增加索引表空間空閑空間大小
在ORACLE里大量刪除記錄后 表和索引里占用的數(shù)據(jù)塊空間并沒有釋放
重建索引可以釋放已刪除記錄索引占用的數(shù)據(jù)塊空間
轉(zhuǎn)移數(shù)據(jù) 重命名的方法可以重新組織表里的數(shù)據(jù)
下面是可以按ORACLE用戶名生成重建索引的SQL腳本
SET ECHO OFF; SET FEEDBACK OFF; SET VERIFY OFF; SET PAGESIZE ; SET TERMOUT ON; SET HEADING OFF; ACCEPT username CHAR PROMPT Enter the index username: ; spool /oracle/rebuild_username sql; SELECT REM + + || chr( ) || REM | INDEX NAME : || owner || || segment_name || lpad( | (length(owner) + length(segment_name)) ) || chr( ) || REM | BYTES : || bytes || lpad ( | (length(bytes)) ) || chr( ) || REM | EXTENTS : || extents || lpad ( | (length(extents)) ) || chr( ) || REM + + || chr( ) || ALTER INDEX || owner || || segment_name || chr( ) || REBUILD || chr( ) || TABLESPACE || tablespace_name || chr( ) || STORAGE ( || chr( ) || INITIAL || initial_extent || chr( ) || NEXT || next_extent || chr( ) || MINEXTENTS || min_extents || chr( ) || MAXEXTENTS || max_extents || chr( ) || PCTINCREASE || pct_increase || chr( ) || ); || chr( ) || chr( ) FROM dba_segments WHERE segment_type = INDEX AND owner= username ORDER BY owner bytes DESC; spool off;
如果你用的是WINDOWS系統(tǒng) 想改變輸出文件的存放目錄 修改spool后面的路徑成
spool c oraclerebuild_username sql
如果你只想對大于max_bytes的索引重建索引 可以修改上面的SQL語句
在AND owner= username 后面加個(gè)限制條件 AND bytes max_bytes
如果你想修改索引的存儲(chǔ)參數(shù) 在重建索引rebuild_username sql里改也可以
比如把pctincrease不等于零的值改成是零
生成的rebuild_username sql文件我們需要來分析一下 它們是否到了需要重建的程度
分析索引 看是否碎片嚴(yán)重 SQLANALYZE INDEX index_name VALIDATE STRUCTURE; col name heading Index Name format a col del_lf_rows heading Deleted|Leaf Rows format col lf_rows_used heading Used|Leaf Rows format col ratio heading % Deleted|Leaf Rows format SELECT name del_lf_rows lf_rows del_lf_rows lf_rows_used to_char(del_lf_rows / (lf_rows)* ) ratio FROM index_stats where name = upper( index_name );
當(dāng)刪除的比率大于 % 時(shí) 肯定是需要索引重建的
經(jīng)過刪改后的rebuild_username sql文件我們可以放到ORACLE的定時(shí)作業(yè)里
比如一個(gè)月或者兩個(gè)月在非繁忙時(shí)間運(yùn)行
如果遇到ORA 錯(cuò)誤 表示索引在的表上有鎖信息 不能重建索引
那就忽略這個(gè)錯(cuò)誤 看下次是否成功
對那些特別忙的表要區(qū)別對待 不能用這里介紹的方法
lishixinzhi/Article/program/Oracle/201311/19038
當(dāng)索引的碎片過多時(shí) 會(huì)影響執(zhí)行查詢的速度 從而影響到我們的工作效率 這時(shí)候采取的最有利的措施莫過于重建索引了 本文主要介紹了Oracle數(shù)據(jù)庫中檢查索引碎片并重建索引的過程 接下來我們就開始介紹這一過程
重建索引的步驟如下
確認(rèn)基本信息
登入數(shù)據(jù)庫 找到專門存放index 的tablespace 并且這個(gè)tablespace下所有index的owner都是tax 將index專門存放在一個(gè)獨(dú)立的tablespace 與數(shù)據(jù)表的tablespace分離 是常用的數(shù)據(jù)庫設(shè)計(jì)方法
查找哪些index需要重建
通過anlyze index validate structure命令可以分析單個(gè)指定的index 并且將單個(gè)index 分析的結(jié)果存放到 index_stats試圖下 一般判斷的依據(jù)是
height pct_used % del_lf_rows / lf_rows + g )
google上下載了遍歷所有index腳本
發(fā)現(xiàn)anlyze index validate structure只能填充單個(gè)index分析信息 于是google了下 從網(wǎng)上下了個(gè)Loop 腳本 遍歷索引空間下所有的索引名字 并且可以把所有index的分析信息存放到自己建立的一個(gè)用戶表中
anlyze index 鎖定index
發(fā)現(xiàn)下載的腳本不好用 應(yīng)為anlyze index在分析索引前要爭取獨(dú)占鎖 鎖住index 很明顯有些index正在被應(yīng)用系統(tǒng)的使用 所以運(yùn)行anlyze失敗 這里吸取的教訓(xùn)是 盡量晚上做這種事 但是本人比較喜歡準(zhǔn)時(shí)回家 所以在語句中添加Exception Handler 拋出anlyze index執(zhí)行失敗的那些index 名稱 使腳本正常運(yùn)行完畢 并且根據(jù)打印到前臺(tái)的index name手動(dòng)執(zhí)行那些index分析
總結(jié)
雖然發(fā)現(xiàn) 個(gè)index中有 個(gè)符合上面的判斷的依據(jù) 但是發(fā)現(xiàn)索引都不大 而那些擁有百萬leaf的索引又沒有符合上面的判斷條件 所以結(jié)論是無需index rebuild online 沒有啥碎片
什么時(shí)候可以rebuild index呢?
rebuild index online 對那些有大量DML操作的大索引是有益的 可以每個(gè)月季度做一次針對較大索引的rebuild 通常哪怕rebuild index online也會(huì)造成I/O爭用 所以有無online意義不大 可以放到 個(gè)晚上 分批執(zhí)行rebuild index 鎖定index 不讓用戶用(沒有用戶等入的時(shí)候) 并且加上paralle 關(guān)鍵字 應(yīng)為發(fā)現(xiàn)數(shù)據(jù)庫服務(wù)器有 個(gè)cpu processors
lishixinzhi/Article/program/Oracle/201311/19014
創(chuàng)建索引語法:
CREATE[UNIQUE]|[BITMAP]INDEXindex_name
--unique表示唯一索引
ONtable_name([column1[ASC|DESC],column2
--bitmap,創(chuàng)建位圖索引
[ASC|DESC],?]|[express])[TABLESPACEtablespace_name][PCTFREEn1]
--指定索引在數(shù)據(jù)塊中空閑空間
[STORAGE(INITIALn2)][NOLOGGING]
--表示創(chuàng)建和重建索引時(shí)允許對表做DML操作,默認(rèn)情況下不應(yīng)該使用
[NOLINE][NOSORT];
--表示創(chuàng)建索引時(shí)不進(jìn)行排序,默認(rèn)不適用,如果數(shù)據(jù)已經(jīng)是按照該索引順序排列的可以使用
擴(kuò)展資料:
1、如果有兩個(gè)或者以上的索引,其中有一個(gè)唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2、至少要包含組合索引的第一列(即如果索引建立在多個(gè)列上,只有它的第一個(gè)列被where子句引用時(shí),優(yōu)化器才會(huì)使用該索引)
3、小表不要簡歷索引
4、對于基數(shù)大的列適合建立B樹索引,對于基數(shù)小的列適合簡歷位圖索引
5、列中有很多空值,但經(jīng)常查詢該列上非空記錄時(shí)應(yīng)該建立索引
6、經(jīng)常進(jìn)行連接查詢的列應(yīng)該創(chuàng)建索引
7、使用createindex時(shí)要將最常查詢的列放在最前面
8、LONG(可變長字符串?dāng)?shù)據(jù),最長2G)和LONGRAW(可變長二進(jìn)制數(shù)據(jù),最長2G)列不能創(chuàng)建索引
9、限制表中索引的數(shù)量(創(chuàng)建索引耗費(fèi)時(shí)間,并且隨數(shù)據(jù)量的增大而增大;索引會(huì)占用物理空間;當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度)