2009-02-10 30 views

回答

12

否,索引將不被用於各個字段創建。

如果你有一個組合大關鍵FIELDA,FieldB,FieldC你

select * from MyTable where FieldA = :a 

select * from MyTable where FieldA = :a and FieldB = :b 

然後,它會使用這個索引(因爲他們是關鍵中的前兩個字段)

如果你有

select * from MyTable where FieldB = :b and FieldC = :c 

如果您正在使用索引的某些部分,而不是完整的索引,則通過索引跳過掃描,完整索引掃描或快速全索引掃描,索引的使用效率會降低。

(感謝大衛·阿爾德里奇的校正)

+1

您可能想要更正索引使用部分 - 索引跳過掃描,完整索引掃描或快速全索引掃描是允許索引用於所有這些情況的機制。 – 2009-02-10 21:08:31

2

您將獲得跨越多個列一個索引,這是不一樣的有每列索引。

0

主鍵是隻有一個(唯一的)索引,可能含有多個列

+0

索引不必是支持主鍵的唯一類型。在某些情況下(可延遲的約束或物化視圖上的PK),您實際上肯定會想要一個非唯一索引。 – 2009-02-10 21:10:02

4

如果您創建列的主鍵(A,B,C),那麼甲骨文將默認創建(A,B。C)唯一索引。你能告訴Oracle使用不同的(不一定是唯一的)現有的索引是這樣的:

alter table mytable add constraint mytable_pk 
primary key (a, b, c) 
using index mytable_index; 
0

對於B選擇索引將被使用,如果列中的僅具有低基數(例如,僅具有2的值)。 一般而言,如果您想象列沒有單獨編制索引,而是索引列連接(這不完全正確,但它適用於第一次近似),則可以猜出此答案。 所以它不是a,b指數,它更像是一個|| b指數。

2

主鍵意味着在主鍵列上創建composite unique index

您可以使用名爲INDEX SKIP SCAN使用這個指數與不包括第一個索引列謂詞一個特殊的訪問路徑:

SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200)) 
    2/
Table created 

SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second) 
    2/
Table altered 

SELECT /*+ INDEX_SS (m pk_mul_first_second) */ 
    * 
FROM t_multiple m 
WHERE mul_second = :test 

SELECT STATEMENT, GOAL = ALL_ROWS        
TABLE ACCESS BY INDEX ROWID  SCOTT T_MULTIPLE 
    INDEX SKIP SCAN     SCOTT PK_MUL_FIRST_SECOND 
0

您可能需要根據您的主鍵列上設置單獨的索引結構體。

複合主鍵和索引將按照以下方式創建索引。假設我有A,B,C列,並且我在(A,B,C)上創建了主鍵。這將導致在索引

  • (A,B,C)
  • (A,B)
  • (A)

甲骨文實際上創建任意的最左邊的一個索引列分組。所以......如果你想在列B上創建一個索引,那麼你必須爲它創建一個索引以及主鍵。

P.S.我知道MySQL exibits這留下最多的行爲,我認爲SQL Server也是最左邊

+0

Oracle只會在(A,B,C)上創建一個索引。你可以創建其他的,但Oracle需要並且只需要一個索引來執行一個主鍵。它必須包括PK的所有列。 – redcayuga 2010-03-11 19:13:56

0

在Oracle中,這不是一個準確的聲明。它只在(A,B,C)上創建1個索引。不會創建(A,B)和(A)索引。

相關問題