2011-04-08 66 views
2

我创建了一个没有主键的新表。但该表确实有一个唯一且编制索引的字段。我应该避免使用主键并使用索引唯一的列吗?

此专栏已获得独特的价值,我可以使其成为主要。 但是,对于SQL性能会有什么样的影响,如果不是主要影响,其他因素会受到什么影响?

问候

+2

引用Joe Celko:*如果它没有主键,它不是表* – 2011-04-08 15:37:45

+2

Marc - 我不确定,但我认为你可能会误解或误解Celko。他所说的是没有*键*的表不是一个表格(相关术语)。 Joe,Chris Date(和我自己)同意的事情之一就是,按照定义,关系表当然必须至少有一个Key,但将一个键指定为“主要”的想法基本上是多余的。在克里斯日期的话中,主键是“纯粹的心理”,因此不是必需的,但它们可能是有用的。 – sqlvogel 2011-04-08 18:38:07

回答

6

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

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

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

+0

谢谢你的回答。索引组织的表格:http://www.orafaq.com/wiki/Index-organized_table – 2012-04-17 07:37:36

2

主键是自动独特和编入索引。通过避免pkey,你基本上可以重新发明轮子,并且也可能降低性能。你应该把它作为主键。

SQL表设计和性能的基本经验法则:使用现成的并且不要试图超越成千上万甚至上百万的工程小时来创建如此强大的RDBMS。绝大多数情况下,主键和外键都将被正确使用,并且查询优化器将为您选择最佳执行方案。

+3

+1虽然Oracle没有“聚簇索引”的概念 – 2011-04-08 15:17:40

+0

@Tony。有点。除了Oracle的IOT在主键上始终具有“聚簇索引”之外,索引组织表(IOT)接近SQL Server的冻结索引,因为SQL Server允许在任何列(如普通索引)上定义聚簇索引。 – 2011-04-08 18:32:21

+0

@Tony:我认为这将是Oracle的一个天然特征。显然有很多方法,但不像SQL Server的pkey那样默认。这里有一个链接:http://www.dba-oracle.com/data_warehouse/clustered_index.htm – 2011-04-08 18:33:05

4

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

2

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

相关问题