索引是加速查詢速度的數(shù)據(jù)庫(kù)對(duì)象。
但索引并非越多越好。過(guò)多的索引會(huì)影響DML語(yǔ)句的性能。
sqlplus scott/tiger
CREATE TABLE EMP (
emp_id NUMBER(8) NOT NULL,
last_name VARCHAR2(20) NOT NULL,
first_name VARCHAR2(20) NOT NULL );
CREATE INDEX EMP_LNON EMP ( last_name );
CREATE INDEX EMP_LN_FN ON EMP ( last_name, first_name );
當(dāng)WHERE子句中有:"LAST_NAME = arameter" or "LAST_NAME LIKE arameter"時(shí)。
索引EMP_LN會(huì)被用到。注意:EMP_LN_FN也會(huì)被用到。而且當(dāng)WHERE子句后有FIRST_NAME = arameter也會(huì)使用第二個(gè)索引。
也就是說(shuō)當(dāng)你的庫(kù)中有第二個(gè)索引的時(shí)候就沒(méi)有必要建立第一個(gè)索引了。應(yīng)該刪除第一個(gè)索引,刪除第一個(gè)索引不但不影響查詢的性能還能加速DML語(yǔ)句。因此,這個(gè)刪除第一個(gè)索引的過(guò)程就是優(yōu)化。
優(yōu)化的規(guī)則如下:
If 一個(gè)表中有兩個(gè)索引 ( I1 and I2 ) and
I1索引所涉及的列數(shù)<=I2索引所涉及的列數(shù) and
I1索引中列的順序與I2索引中列的順序相同
Then
IfI1索引是 UNIQUE then
IfI2索引是一個(gè)外鍵的參考列 then
Do Nothing
Else
刪除I2
End If
Else
刪除I1
End If
End If
用下面的語(yǔ)句查詢出SCOTT模式下面重復(fù)的索引:
conn sys/sys as sysdba
SELECT
/*+ RULE */
tab_owner.name owner, t.name table_name,
o1.name || '(' || DECODE(bitand(i1.property, 1), 0, 'N', 1, 'U', '*') || ')' included_index_name ,
o2.name || '(' || DECODE(bitand(i2.property, 1), 0, 'N', 1, 'U', '*') || ')' including_index_name
FROMsys.USER$ tab_owner, sys.OBJ$ t, sys.IND$ i1, sys.OBJ$ o1, sys.IND$ i2, sys.OBJ$ o2
WHERE i1.bo# = i2.bo# AND i1.obj# <> i2.obj# AND i2.cols >= i1.cols AND i1.cols > 0 AND
i1.cols = ( SELECT /*+ ORDERED */ COUNT(1) FROM sys.ICOL$ cc1, sys.icol$ cc2
WHERE cc2.obj# = i2.obj# AND cc1.obj# = i1.obj# AND
cc2.pos# = cc1.pos# AND cc2.COL# = cc1.COL#) AND
i1.obj# = o1.obj# AND i2.obj# = o2.obj# AND t.obj# = i1.bo# AND
t.owner# = tab_owner.USER# AND tab_owner.name LIKE 'SCOTT'
ORDER BY 1, 2
OWNER TABLE_NAME
------------------------------ ------------------------------
INCLUDED_INDEX_NAME INCLUDING_INDEX_NAME
--------------------------------- ---------------------------------
SCOTT EMP
EMP_LN EMP_LN_FN
但索引并非越多越好。過(guò)多的索引會(huì)影響DML語(yǔ)句的性能。
sqlplus scott/tiger
CREATE TABLE EMP (
emp_id NUMBER(8) NOT NULL,
last_name VARCHAR2(20) NOT NULL,
first_name VARCHAR2(20) NOT NULL );
CREATE INDEX EMP_LNON EMP ( last_name );
CREATE INDEX EMP_LN_FN ON EMP ( last_name, first_name );
當(dāng)WHERE子句中有:"LAST_NAME = arameter" or "LAST_NAME LIKE arameter"時(shí)。
索引EMP_LN會(huì)被用到。注意:EMP_LN_FN也會(huì)被用到。而且當(dāng)WHERE子句后有FIRST_NAME = arameter也會(huì)使用第二個(gè)索引。
也就是說(shuō)當(dāng)你的庫(kù)中有第二個(gè)索引的時(shí)候就沒(méi)有必要建立第一個(gè)索引了。應(yīng)該刪除第一個(gè)索引,刪除第一個(gè)索引不但不影響查詢的性能還能加速DML語(yǔ)句。因此,這個(gè)刪除第一個(gè)索引的過(guò)程就是優(yōu)化。
優(yōu)化的規(guī)則如下:
If 一個(gè)表中有兩個(gè)索引 ( I1 and I2 ) and
I1索引所涉及的列數(shù)<=I2索引所涉及的列數(shù) and
I1索引中列的順序與I2索引中列的順序相同
Then
IfI1索引是 UNIQUE then
IfI2索引是一個(gè)外鍵的參考列 then
Do Nothing
Else
刪除I2
End If
Else
刪除I1
End If
End If
用下面的語(yǔ)句查詢出SCOTT模式下面重復(fù)的索引:
conn sys/sys as sysdba
SELECT
/*+ RULE */
tab_owner.name owner, t.name table_name,
o1.name || '(' || DECODE(bitand(i1.property, 1), 0, 'N', 1, 'U', '*') || ')' included_index_name ,
o2.name || '(' || DECODE(bitand(i2.property, 1), 0, 'N', 1, 'U', '*') || ')' including_index_name
FROMsys.USER$ tab_owner, sys.OBJ$ t, sys.IND$ i1, sys.OBJ$ o1, sys.IND$ i2, sys.OBJ$ o2
WHERE i1.bo# = i2.bo# AND i1.obj# <> i2.obj# AND i2.cols >= i1.cols AND i1.cols > 0 AND
i1.cols = ( SELECT /*+ ORDERED */ COUNT(1) FROM sys.ICOL$ cc1, sys.icol$ cc2
WHERE cc2.obj# = i2.obj# AND cc1.obj# = i1.obj# AND
cc2.pos# = cc1.pos# AND cc2.COL# = cc1.COL#) AND
i1.obj# = o1.obj# AND i2.obj# = o2.obj# AND t.obj# = i1.bo# AND
t.owner# = tab_owner.USER# AND tab_owner.name LIKE 'SCOTT'
ORDER BY 1, 2
OWNER TABLE_NAME
------------------------------ ------------------------------
INCLUDED_INDEX_NAME INCLUDING_INDEX_NAME
--------------------------------- ---------------------------------
SCOTT EMP
EMP_LN EMP_LN_FN
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
