Oracle 如果列是主键,它是否需要位于索引中
我有一个使用ENC_ID作为主键的表。此字段也是一个FK(另一个表控制其创建)到许多其他表(在其中一个表中创建) 它有两个指数:Oracle 如果列是主键,它是否需要位于索引中,oracle,oracle10g,indexing,Oracle,Oracle10g,Indexing,我有一个使用ENC_ID作为主键的表。此字段也是一个FK(另一个表控制其创建)到许多其他表(在其中一个表中创建) 它有两个指数: IX_00-部门ID、到达时间、附件ID-服务选择查询;WHERE条款中的部门ID、到达时间;JOIN子句中的ENC_ID IX_01-出发时间,ENC_ID-服务删除、插入和更新查询;WHERE条款中的出发时间;JOIN子句中的ENC_ID 问题: 将ENC_ID定义为PK是否会自动创建索引 在两个索引中都有ENC_ID字段是否有价值?还是应该是第三个索引中的唯一一
对。PK始终由唯一索引支持(如果您只是在列上声明PK约束) 在两个索引中都有ENC_ID字段是否有价值 这取决于查询,例如,如果索引包含SQL语句中使用的所有列,那么这确实有好处,因为Oracle可以在这种情况下使用索引扫描。如果SQL语句使用的列多于索引中定义的列,那么添加PK列可能没有任何优势 是否使用索引取决于几件事(查询、表中的行数、索引值的分布等等),因此不可能给您一个通用规则“这将始终被使用”或“这将永远不会被使用” 您可能还需要阅读概念手册:
“PK总是由唯一索引支持的”。它也可以很高兴地使用非唯一索引。@DazzaL:我知道这会发生;)但是如果你只是将一列声明为PK,那么你将得到一个唯一索引。在Oracle中,唯一索引和非唯一索引在结构上没有区别。只是在唯一索引中,rowid不被视为键的一部分,而在非唯一索引中,rowid被视为键的一部分。@a_horse_,_no_name:)是的,我假设他说的是将PK添加到现有表中(可能有可用的非唯一索引),因此我指出了这一点。