Oracle 如果列是主键,它是否需要位于索引中

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字段是否有价值?还是应该是第三个索引中的唯一一

我有一个使用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字段是否有价值?还是应该是第三个索引中的唯一一列
  • 将ENC_ID定义为PK是否会自动创建索引


    对。PK始终由唯一索引支持(如果您只是在列上声明PK约束)

    在两个索引中都有ENC_ID字段是否有价值

    这取决于查询,例如,如果索引包含SQL语句中使用的所有列,那么这确实有好处,因为Oracle可以在这种情况下使用索引扫描。如果SQL语句使用的列多于索引中定义的列,那么添加PK列可能没有任何优势

    是否使用索引取决于几件事(查询、表中的行数、索引值的分布等等),因此不可能给您一个通用规则“这将始终被使用”或“这将永远不会被使用”

    您可能还需要阅读概念手册:

  • 只有当一个索引(唯一或非唯一)不可供其使用时,它才会创建索引。i、 e.如果你在(ENC_ID,其他任何东西)上说了一个索引,那么添加一个PK只会使用该索引,而不会创建另一个索引

  • 由于您不根据ENC_ID进行过滤,只加入,然后可能不加入,就像您从该表驱动一样,那么过滤列就是您需要索引的内容(根据查询的不同,它可能仍然有好处(例如,如果它可以使用另一个加入索引来消除表访问之前的行)。如果您是从另一个表驱动,那么它将希望使用一个在前缘具有ENC_ID的索引。不过,我们需要查看SQL以提供更明确的答案


  • “PK总是由唯一索引支持的”。它也可以很高兴地使用非唯一索引。@DazzaL:我知道这会发生;)但是如果你只是将一列声明为PK,那么你将得到一个唯一索引。在Oracle中,唯一索引和非唯一索引在结构上没有区别。只是在唯一索引中,rowid不被视为键的一部分,而在非唯一索引中,rowid被视为键的一部分。@a_horse_,_no_name:)是的,我假设他说的是将PK添加到现有表中(可能有可用的非唯一索引),因此我指出了这一点。