我应该避免使用主键并使用索引的唯一列吗?

时间:2011-04-08 15:05:51

标签: oracle indexing primary-key clustered-index

我创建了一个没有主键的新表。但该表确实有一个唯一且索引的字段。

此列具有唯一值,我可以将其设为Primary。 但是,对于SQL性能会产生什么样的影响?如果它不是主要的,那么还有哪些因素会受到影响?

此致

4 个答案:

答案 0 :(得分:6)

如果列可能包含NULL值,则它不能是主键。在这种情况下,唯一的索引是您可以做的最好的(请注意,这不会阻止多个行具有NULL值)。

如果它永远不会包含NULL值,那么您绝对应该在列上添加NOT NULL约束或将其作为主键。无论哪种方式,这都告诉优化器该列永远不会有NULL值,这允许它考虑某些不可能的查询优化。

我不认为(a)主键约束和(b)唯一索引和NOT NULL约束的组合之间会有任何显着的性能差异。无论哪种方式都为优化器提供了有关表内容的相同信息。两者都可以用作外键的目标。但是,有一些特定的功能需要存在主键 - 例如,索引组织的表必须有一个。

答案 1 :(得分:4)

主键永远不能为NULL,而具有UNIQUE约束的列可以是。

答案 2 :(得分:2)

主键自动唯一且已编制索引。通过避免使用pkey,你基本上可以重新发明轮子并且可能也会降低性能。你应该把它作为主键。

SQL表设计和性能的基本经验法则:使用现有的东西,不要试图想出创建如此强大的RDBMS所需的数千甚至数百万的工程时间。在绝大多数情况下,主键和外键都将正确使用,查询优化器将为您选择最佳的执行方案。

答案 3 :(得分:2)

“主”候选键与任何其他候选键之间在原则上或实践上没有区别。重要的是,表应该有约束来强制执行尽可能多的密钥以确保数据的完整性(至少一个密钥)。主键只有在您选择时才有用或必要 - 尽管开发人员和其他用户为某种目的或其他目的挑出特定键通常非常方便。