1、速度因素 PARALLEL選項:當創(chuàng)建索引時,Oracle首先會進行全表掃描來收集符號鍵和ROWID對,而PARALLEL選項允許多處理器并行掃描表,這樣就會加速索引的創(chuàng)建過程。一般推薦的PARALLEL值為CPU數(shù)減1。 NOLOGGING選項:NOLOGGING選項因為不寫日志,所以大大提高了性能,比不使用NOLOGGING選項大約會節(jié)省70%的時間。使用NOLOGGING創(chuàng)建索引的唯一風險就是如果數(shù)據(jù)庫需要做前滾恢復(fù),你將不得不重建索引。 2、空間和結(jié)構(gòu)因素 COMPRESS選項:COMPRESS選項用于在創(chuàng)建非唯一性索引時壓縮重復(fù)值。對于連接索引(即索引包含多列)來說,COMPRESS選項會使索引的大小減少一半以上。COMPRESS選項也可以設(shè)置連接索引的前置長度。 使用大BLOCKSIZE的表空間:將索引建立在大BLOCKSIZE的表空間上,將大大降低索引樹的層次。 在$ORACLE_HOME/network/admin/中創(chuàng)建protocol.ora文件﹐其內(nèi)容如下﹕ tcp.validnode_checking=yes #下面兩行取其一:
創(chuàng)新互聯(lián)專注骨干網(wǎng)絡(luò)服務(wù)器租用10余年,服務(wù)更有保障!服務(wù)器租用,服務(wù)器托管 成都服務(wù)器租用,成都服務(wù)器托管,骨干網(wǎng)絡(luò)帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務(wù)器。
不能直接修改,只能先drop單列的index.
再創(chuàng)建多列的復(fù)合索引。
創(chuàng)建索引的時候指定啊。
create
index
索引名
on
表名(列名
desc);--desc就指定是降序的。
可以測試:
在表的一列上建個降序索引。建個非空約束。查找該列,查詢執(zhí)行計劃,是索引全掃描。查出來的數(shù)據(jù)是從大玩小查出來的。
CREATE
TABLE
ttt(ID
NUMBER);
ALTER
TABLE
TTT
MODIFY
ID
NOT
NULL;
CREATE
INDEX
idx_ttt
ON
ttt(ID
DESC);
BEGIN
FOR
i
IN
1
..
100
LOOP
INSERT
INTO
ttt
(id)
VALUES
(i);
END
LOOP;
COMMIT;
END;
/
BEGIN
dbms_stats.gather_table_stats(ownname
=
'HR',
tabname
=
'TTT');
dbms_stats.gather_index_stats(ownname
=
'HR',
indname
=
'IDX_TTT');
END;
/
SELECT
t.id
FROM
ttt
t;--查看執(zhí)行計劃,索引全掃描。
--查詢出來的數(shù)據(jù)是從100往1方向的。
SELECT
/*+no_index(t
idx_ttt)*/t.id
FROM
ttt
t;--查看執(zhí)行計劃,全表掃描
--查詢出來的數(shù)據(jù)是從1往100方向的。
創(chuàng)建索引語法:
CREATE [UNIQUE] | [BITMAP] INDEX index_name
--unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2
--bitmap,創(chuàng)建位圖索引
[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]
--指定索引在數(shù)據(jù)塊中空閑空間
[STORAGE (INITIAL n2)][NOLOGGING]
--表示創(chuàng)建和重建索引時允許對表做DML操作,默認情況下不應(yīng)該使用
[NOLINE][NOSORT];
--表示創(chuàng)建索引時不進行排序,默認不適用,如果數(shù)據(jù)已經(jīng)是按照該索引順序排列的可以使用
擴展資料:
1、如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2、至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句引用時,優(yōu)化器才會使用該索引)
3、小表不要簡歷索引
4、對于基數(shù)大的列適合建立B樹索引,對于基數(shù)小的列適合簡歷位圖索引
5、列中有很多空值,但經(jīng)常查詢該列上非空記錄時應(yīng)該建立索引
6、經(jīng)常進行連接查詢的列應(yīng)該創(chuàng)建索引
7、使用create index時要將最常查詢的列放在最前面
8、LONG(可變長字符串數(shù)據(jù),最長2G)和LONG RAW(可變長二進制數(shù)據(jù),最長2G)列不能創(chuàng)建索引
9、限制表中索引的數(shù)量(創(chuàng)建索引耗費時間,并且隨數(shù)據(jù)量的增大而增大;索引會占用物理空間;當對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,降低了數(shù)據(jù)的維護速度)
當索引的碎片過多時,會影響執(zhí)行查詢的速度,從而影響到我們的工作效率。這時候采取的最有利的措施莫過于重建索引了。本文主要介紹了Oracle數(shù)據(jù)庫中檢查索引碎片并重建索引的過程,接下來我們就開始介紹這一過程。 重建索引的步驟如下: 1. 確認基本信息 登入數(shù)據(jù)庫,找到專門存放index 的tablespace,并且這個tablespace下所有index的owner都是tax.將index專門存放在一個獨立的tablespace, 與數(shù)據(jù)表的tablespace分離,是常用的數(shù)據(jù)庫設(shè)計方法。 2. 查找哪些index需要重建 通過anlyze index .... validate structure命令可以分析單個指定的index,并且將單個index 分析的結(jié)果存放到 index_stats試圖下。一般判斷的依據(jù)是: height 4 pct_used 50% del_lf_rows / lf_rows +0.001 0.03 g ) 3. google上下載了遍歷所有index腳本 發(fā)現(xiàn)anlyze index .... validate structure只能填充單個index分析信息,于是google了下,從網(wǎng)上下了個Loop 腳本,遍歷索引空間下所有的索引名字,并且可以把所有index的分析信息存放到自己建立的一個用戶表中。 4. anlyze index 鎖定index 發(fā)現(xiàn)下載的腳本不好用,應(yīng)為anlyze index在分析索引前要爭取獨占鎖,鎖住index,很明顯有些index正在被應(yīng)用系統(tǒng)的使用,所以運行anlyze失敗。這里吸取的教訓(xùn)是,盡量晚上做這種事。但是本人比較喜歡準時回家,所以在語句中添加Exception Handler,拋出anlyze index執(zhí)行失敗的那些index 名稱,使腳本正常運行完畢。并且根據(jù)打印到前臺的index name手動執(zhí)行那些index分析。 5. 總結(jié) 雖然發(fā)現(xiàn)522個index中有160個符合上面的判斷的依據(jù)。但是發(fā)現(xiàn)索引都不大,而那些擁有百萬leaf的索引又沒有符合上面的判斷條件,所以結(jié)論是無需index rebuild online. 沒有啥碎片。 6.什么時候可以rebuild index呢? rebuild index online,對那些有大量DML操作的大索引是有益的??梢悦總€月季度做一次針對較大索引的rebuild。
------索引名不能重復(fù),如果要重新建同名索引,必須把以前的索引刪掉在建索引
-----刪除索引
drop index 索引名;
-----創(chuàng)建索引
create index 索引名 on 表名 (表中的字段,表中的字段)
tablespace 指定的表空間
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);