2013-09-24 50 views
1

我想知道主键的长度是否对性能有不小的影响。例如,考虑以下表格定义,表主键长度

CREATE TABLE table1 (
    id   VARCHAR(50) PRIMARY KEY, 
    first_column VARCHAR(50) NULL, 
    second_column VARCHAR(75) NOT NULL 
); 


CREATE TABLE table2(
    id   VARCHAR(250) PRIMARY KEY, 
    first_column VARCHAR(50) NULL, 
    second_column VARCHAR(75) NOT NULL 
); 

Table1的表现比table2好,为什么?

+2

任何特定的DBMS?还有什么你用作甚至50个字符长的标识符? –

+0

我的意思是没有特定的DBMS。但是,我很欣赏你对任何特定DBMS的见解。而为了长久的关注,在商业世界中,这种情况正在发生。 – habanoz

回答

0

是的,varchar(50)的主键会更有效率。就像你知道主键持有集群索引一样,并且只要在表中输入新记录,该值就会在集群索引内部排列。您将在数十亿条记录中看到这种差异。所以它通常建议有一个自然的主键。像ID等

+0

Ashutosh,主键不一定是“聚集”的。在SQL Server和DB2中,您可以在任何合适的列集上进行集群(或者根本没有集群)。 Oracle和MySql通常分别使用IOT和集群密钥的主键。在所有情况下,我相信varchar列的声明大小并不重要。数据的大小是重要的。 – sqlvogel

2

通常,性能将取决于存储的内容比varchar列的长度更多。如果varchar(50)和varchar(250)列的中值长度均为40个字符,则它们可能具有相似的性能。

在某些dbms中,主键默认情况下也是一个集群键。但是如果你的主键不适合作为一个集群键,你可以通过通常告诉dbms不使用集群键。

+0

可以指定主键上的聚集索引是可选的数据库吗? –

+0

除了更短的更好的本能,你能解释为什么更短的指数会表现更好吗? – habanoz

+0

在SQL Server,DB2和Sybase ASE中,群集索引是可选的或不存在的。 PostgreSQL不*真的*拥有它们;你可以根据任何索引(我认为)对一个表进行聚类,但PostgreSQL不维护新行的聚簇。我认为Oracle具有索引组织的表格而不是聚簇索引;他们是可选的。我确定还有其他人。 –