如果我在Oracle的多个列中设置主键,是否还需要在需要时创建索引?
我相信当您在一个列上设置主键时,您可以将其编入索引;多列PK是一样的吗?
由于
答案 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)上创建主键。这将导致索引
Oracle实际上在任何最左边的列分组上创建了一个索引。所以...如果你只想要一个B列的索引,你将不得不为它创建一个索引以及主键。
P.S。我知道MySQL exibits这个最左边的行为,我认为SQL Server也是最左边的
答案 7 :(得分:0)
在Oracle中,这不是一个准确的陈述。它只在(A,B,C)上创建一个索引。不创建(A,B)和(A)索引。