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

时间:2012-11-27 17:12:20

标签: oracle oracle10g indexing

我有一个使用ENC_ID作为PK的表。此字段也是一个FK(另一个表控制其创建)到许多其他表(它在其他表中创建)。

它有两个指数:

  1. IX_00 - DEPT_ID,ARRIVAL_TIME,ENC_ID - 服务SELECT查询; WHERE子句中的DEPT_ID,ARRIVAL_TIME; JOIN条款中的ENC_ID
  2. IX_01 - DEPARTURE_TIME,ENC_ID - 提供DELETE,INSERT和UPDATE查询服务; WHERE子句中的DEPARTURE_TIME; JOIN条款中的ENC_ID
  3. 问题:

    1. 将ENC_ID定义为PK会自动创建索引吗?
    2. 在任一索引中都有ENC_ID字段有什么价值吗?或者它应该是第三个索引中的唯一列?

2 个答案:

答案 0 :(得分:0)

  

将ENC_ID定义为PK会自动创建索引吗?

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

  

在任一索引

中使用ENC_ID字段是否有任何价值

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

是否使用索引取决于几个方面(查询,表中的行数,索引值的分布,......),因此不可能给出一般规则“这将永远使用“或”这将永远不会被使用“。

您可能还需要阅读概念手册:http://docs.oracle.com/cd/E11882_01/server.112/e25789/indexiot.htm#BABHJAJF

答案 1 :(得分:0)

  1. 只有当一个索引(唯一或非唯一)无法使用时,它才会创建索引。即如果你曾经说过一个索引(ENC_ID,其他什么),那么添加PK只会使用该索引并且不会创建另一个索引。

  2. 因为你没有过滤ENC_ID而只是加入然后可能没有,好像你从那张桌子开车,那么过滤列就是你需要索引的东西(根据查询它可能仍然有好处)例如,如果它可以使用另一个连接索引在表访问完成之前消除行。)如果你从另一个表开车,那么它会想要在前沿使用带有ENC_ID的索引。我们需要看到SQL提供了更明确的答案。