2013-10-25 43 views
6

我有表甲骨文:單多列索引或兩個單列指標

create table1(
    column1 number(10, 
    column2 number(10), 
    column3 number(10) 
); 

column1是主鍵 column2column3是2列

外鍵

我創建唯一約束

alter table table1 
     add constraint table1_contr1 unique(column1,column2) 
     using index tablespace tbs1; 

當我去創建索引在兩列如

create index table1_idx1 on table1(column1,coulmn2); 

ERROR at line 1: 
ORA-01408: such column list already indexed 

因此,當我創建唯一約束時,Oracle已經創建了索引。但是,如果我單獨創建索引它接受那些

create index table1_idx1 on table1(column1); 
create index table2_idx2 on table2(column2); 

現在的問題是,在兩列我還需要擔心在每列上創建索引有唯一約束後?每個列上沒有索引會在訪問對象時影響性能嗎?

它在oracle 11R2上。

+1

當你說'column2'和'column3'是外鍵時,你的意思是說'column2,column3'的組合是具有複合主鍵的單個父表的外鍵嗎?或者說,每一個「column2」和「column3」都是外鍵,以便將父表與單列主鍵分開?如果'column1'已經是主鍵,爲什麼你要在'column1'和'column2'的組合上創建一個唯一的約束。 'column1'已經是唯一的,所以它和其他任何東西的組合都是唯一的。你是否意味着你正在爲'col2,col3'創建一個唯一的約束? –

+0

對不起,錯字錯誤。我正在創建(col2,col3)的唯一約束。 – user2824874

回答

9

這取決於...

這是非常不可能的只是column1指數將是有益的,如果你已經有了一個column1, column2綜合指數。由於column1是主要索引,因此只有column1作爲謂詞的查詢才能夠使用組合索引。如果您經常運行需要對索引進行全面掃描的查詢,並且column2的存在大大增加了索引的大小,那麼可能只有column1上的索引會更有效,因爲完整的索引掃描需要少做I/O。但這是一個非常不尋常的情況。

如果針對表的某些查詢僅指定謂詞column2,那麼僅column2上的索引可能會有所幫助。如果column1的值相對較少,Oracle有可能使用組合索引執行索引跳過掃描,以滿足只將column2指定爲謂詞的查詢。但是跳過掃描的效率可能遠低於範圍掃描的效率,因此只需要column2的索引就可以使這些查詢受益。如果column1有大量不同的值,那麼跳過掃描的效率會更低,而只有column2的索引會更有利。當然,如果你從來沒有使用column2來查詢表格而沒有在column1上指定一個謂詞,那麼你就不需要僅僅在column2上的索引。

0

索引是提高信息檢索性能的結構,即每當使用SELECT子句時,因爲它將查找索引的鍵並返回鏈接到該鍵的值。但是,索引會增加更新和插入操作的成本,因爲它需要更新結構以保持信息檢索的效率。

爲單列創建索引不會提高讀取性能,但會降低寫入和更新性能AFAIK。