oracle 建立 使用索引和判斷索引是否被使用

2021-06-21 06:11:09 字數 3663 閱讀 2123

一、建立索引:

create index index_name on table_name(table_field);

二、修改索引:

alter index 索引名 rename to 新索引名

三、刪除索引:

drop index 索引名

四、檢視索引:

<1>.檢視索引個數和類別

select * from user_indexes where table_name='表名' ;

<2>.檢視索引被索引的字段

select * from user_ind_columns where index_name=upper('&index_name');

<3>、查詢出所有的使用者表

select * from user_tables 可以查詢出所有的使用者表

select owner,table_name from all_tables; 查詢所有表,包括其他使用者表

<4>、查詢出使用者所有表的索引

select * from user_indexes

<5>、查詢使用者表的索引(非聚集索引):

select * from user_indexes where uniqueness='nonunique'

<6>、查詢使用者表的主鍵(聚集索引):

select * from user_indexes where uniqueness='unique'

<7>、查詢表的索引

select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name='node'

<8>、查詢表的主鍵

select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'p'

and cu.table_name  = 'node'

<9>、查詢表的唯一性約束(包括名稱,構成列):

select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name=au.constraint_name and

cu.table_name='node'

<10>、查詢表的外來鍵

select * from user_constraints c where c.constraint_type = 'r' and c.table_name='staffposition'

查詢外來鍵約束的列名:

select * from user_cons_columns cl where cl.constraint_name = 外來鍵名稱

查詢引用表的鍵的列名:

select * from user_cons_columns cl where cl.constraint_name = 外來鍵引用表的鍵名

五、判斷索引是否被執行:

索引會增加io,增加空間,也會增加一些資料庫的額外開銷,對於沒有用到得索引,應盡量避免不建,建立了的,把沒用的索引根據情況刪除。有唯一約束,主鍵的列不要刪除。建議乙個表的所以在4-5個左右,不要太多,這是乙個參考值,當然還要具體分析,面是判斷的方法:

1,分析索引

alter index index_name monitoring usage;

2,產看,used是否為yes,當然要觀察一段時間才能確定是否被使用。

select table_name,index_name,used from v$object_usage;

這兩條需要一起使用才能看得到使用效果,例如:

alter index index_user monitoring usage;

select table_name,index_name,used from v$object_usage; 

六、使用索引注意事項:

《一》、以下的方法會引起索引失效

‍            1,<>

2,單獨的》,<,(有時會用到,有時不會)

3,like "%_" 百分號在前.

4,表沒分析.

5,單獨引用復合索引裡非第一位置的索引列.

6,字元型字段為數字時在where條件裡不新增引號.

7,對索引列進行運算.需要建立函式索引.

8,not in ,not exist.

9,當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況。

10, 索引失效。

11,基於cost成本分析(oracle因為走全表成本會更小):查詢小表,或者返回值大概在10%以上

12,有時都考慮到了 但就是不走索引,drop了從建試試在

13,b-tree索引 is null不會走,is not null會走,位圖索引 is null,is not null   都會走

14,聯合索引 is not null 只要在建立的索引列(不分先後)都會走, in null時   必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列都滿足is null的時候),或者=乙個值;當建立索引的第一位置是=乙個值時,其他索引列可以是任何情況(包括is null =乙個值),以上兩種情況索引都會走。其他情況不會走。

《二》、索引失效解決方法

1. 選用適合的oracle優化器 oracle的優化器共有3種:

a. rule (基於規則) b. cost (基於成本) c. choose (選擇性)。

設定預設的優化器,可以通過對init.ora檔案中optimizer_mode引數的各種宣告,如rule,cost,choose,all_rows,first_rows 。你當然也在sql句級或是會話(session)級對其進行覆蓋。為了使用基於成本的優化器(cbo, cost-based optimizer) , 你必須經常執行analyze 命令,以增加資料庫中的物件統計資訊(object statistics)的準確性。如果資料庫的優化器模式設定為選擇性(choose),那麼實際的優化器模式將和是否執行過analyze命令有關。如果table已經被analyze過, 優化器模式將自動成為cbo , 反之,資料庫將採用rule形式的優化器。

2、‍重建索引

‍alter index 索引名 rebuild 【online】

3、強制索引

給該語句加上hint後,強制其使用'record_entityid' 這個索引,sql語句變成這樣引用

select  index(record,record_entityid)  from record  where entityid='24' and entitytype='blog';

index(record,record_entityid) */ 中,index表示強制使用index,record是表名,record_entityid是索引名。其執行計畫跟測試資料庫上一致,都是使用用            'record_entityid' 這個索引,邏輯讀寫同樣為4。後來經過測試,在不加hint的情況下,對該錶和兩個索引執行analyze 後,同樣也能使用 'record_entityid' 這個索引。但是因為該錶更新頗為頻繁,不知道要多久就要再分析一次

Oracle中檢視建立索引和使用索引的注意點

一 檢視和建立索引 select from user indexes where table name student create index i student num on student num 二 使用索引的注意點 型別匹配 若student中num列是varchar型別,語句select...

oracle 建立索引

要在oracle資料庫中使用索引,首先需要建立oracle索引。下面就為您介紹建立oracle索引的方法,希望對您能有所幫助。適當的使用索引可以提高資料檢索速度,可以給經常需要進行查詢的字段建立索引。oracle的索引分為5種 唯一索引,組合索引,反向鍵索引,位圖索引,基於函式的索引 建立oracl...

oracle建立索引

create recreate indexes 建立索引 一張表上建立多個索引,一般是該錶的資料量大,建立索引能夠提高資料庫的select效能。一般是在要select的字段建立索引。oracle建立索引語法 create index indexname on tablename colum crea...