0

我有一个使用 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

问题:

  1. 将 ENC_ID 定义为 PK 是否会自动创建索引?
  2. 在任一索引中都有 ENC_ID 字段是否有任何价值?还是应该是第三个索引中的唯一列?
4

2 回答 2

0
  1. 仅当一个索引(唯一或非唯一)不可用时,它才会创建一个索引。即,如果您在(ENC_ID,其他)上说了一个索引,那么添加一个 PK 将只使用该索引而不会创建另一个。

  2. 因为您没有在 ENC_ID 上进行过滤并且仅加入然后可能不会加入,就好像您从该表驱动一样,那么过滤列就是您需要索引的内容(根据查询,它可能仍然有好处(例如,如果它可以使用另一个加入索引以在表访问完成之前消除行)。如果您从另一个表中开车,那么它会希望在前沿使用带有 ENC_ID 的索引。我们需要查看 SQL 以提供更明确的回答虽然。

于 2012-11-27T17:23:23.017 回答
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

于 2012-11-27T17:22:47.263 回答