在多列中创建主键是否为所有列生成索引?

时间:2009-02-10 12:04:22

标签: oracle indexing primary-key multiple-columns

如果我在Oracle的多个列中设置主键,是否还需要在需要时创建索引?

我相信当您在一个列上设置主键时,您可以将其编入索引;多列PK是一样的吗?

由于

8 个答案:

答案 0 :(得分: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

如果您使用索引的某些部分,而不是完整索引,则索引跳过扫描,完整索引扫描或快速完整索引扫描将无法有效地使用索引。

(感谢David Aldridge的更正)

答案 1 :(得分:4)

如果在列(A,B,C)上创建主键,则Oracle默认会在(A,B。C)上创建唯一索引。您可以告诉Oracle使用不同的(不一定是唯一的)现有索引,如下所示:

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

答案 2 :(得分:2)

您将在多个列中获得一个索引,这与在每个列上都有索引不同。

答案 3 :(得分: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

答案 4 :(得分:0)

主键只有一个(唯一)索引,可能包含多个列

答案 5 :(得分:0)

如果列a仅具有低基数(例如,只有2个值),则将使用B select index。 一般来说,如果你想象的是没有单独索引的列,而是列的索引连接(它不完全正确,但它适用于第一次近似),你可能已经猜到了这个答案。 所以它不是a,b索引,它更像是一个|| b索引。

答案 6 :(得分:0)

您可能需要根据主键结构在列上设置单个索引。

复合主键和索引将以下列方式创建索引。假设我有列A,B,C和i在(A,B,C)上创建主键。这将导致索引

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

Oracle实际上在任何最左边的列分组上创建了一个索引。所以...如果你只想要一个B列的索引,你将不得不为它创建一个索引以及主键。

P.S。我知道MySQL exibits这个最左边的行为,我认为SQL Server也是最左边的

答案 7 :(得分:0)

在Oracle中,这不是一个准确的陈述。它只在(A,B,C)上创建一个索引。不创建(A,B)和(A)索引。