Sql server SQL Server 2008中的索引与唯一键

Sql server SQL Server 2008中的索引与唯一键,sql-server,indexing,Sql Server,Indexing,下表用于连接3个表: ClientID int BlogID int MentionID int 假设查询总是通过ClientID进行的,我可以创建一个多列索引(ClientID、BlogID、indicationid) 问题是,我应该将其创建为聚集索引还是唯一键?我知道聚集索引将数据存储在其叶节点上。当然,在这种情况下,索引就是数据,所以我不知道SQL Server是否会复制数据。尽管如此,我在MSDN上找不到任何关于使用“唯一密钥”的意义的信息 这与Type=Index&IsUniq

下表用于连接3个表:

ClientID int
BlogID  int
MentionID   int
假设查询总是通过ClientID进行的,我可以创建一个多列索引(ClientID、BlogID、indicationid)

问题是,我应该将其创建为聚集索引还是唯一键?我知道聚集索引将数据存储在其叶节点上。当然,在这种情况下,索引就是数据,所以我不知道SQL Server是否会复制数据。尽管如此,我在MSDN上找不到任何关于使用“唯一密钥”的意义的信息

这与Type=Index&IsUnique=yes有何不同

有人能告诉我每种方法的优点吗?

  • 一个
    唯一索引
    ,一个
    唯一键
    唯一约束
    基本上是 同样的事情。他们导致了一场灾难 强制唯一性的索引

  • 聚集意味着索引 成为表格本身。很好 要拥有聚集索引,则为 这张桌子挂在一个角落里 无序堆


唯一和聚集是不相关的属性。你可以用任何你喜欢的方式组合它们。因此,在您的情况下,我将创建一个唯一的聚集索引。通常的方法是将索引创建为聚集主键,如果在三列上创建聚集唯一索引,则数据不会被复制

唯一聚集索引将为数据,同时为索引:-)

因为这是一个三向联接表,所以这个聚集索引可能非常有意义。我会说:加油

聚集索引是“表本身”,即索引节点排列在树中,其叶节点包含行数据。聚集索引不必声明为唯一的(尽管它通常是唯一的);如果不是唯一的,服务器将向该索引隐式添加一个“uniqalizer”,以便每一行都是唯一标识的

其他索引将聚集索引值存储为它们的叶节点(如果它们包含在CREATEINDEX staetment中的INCLUDE子句中,则可能存储其他一些列)


任何索引都可能标记为唯一,因此服务器将执行额外的检查,以防止重复值进入表。

唯一索引和
唯一约束是一些不同的概念

  • UNIQUE CONSTRAINT
    是一个逻辑概念,意思是“确保此列是唯一的,无论如何”
  • UNIQUE INDEX
    是一个物理概念,它意味着“在该列上创建一个
    B-Tree
    索引,并在插入重复项时失败”
后者意味着前者,但反之亦然

例如,在
Oracle
中,如果在
col1
上有一个非唯一索引:

  • 创建唯一索引(col1)
    将失败并显示“这些列已被索引”
  • ALTER TABLE ADD CONSTRAINT UNIQUE(col1)
    将成功,并使用现有索引来监控约束

如果您只希望列是唯一的,请使用
CONSTRAINT
,如果您知道
B-树
索引是您想要的(以加快搜索等)。

您似乎在要求以下各项之间的差异:

 MYTABLE
 id integer primary key autoincrement
 clientid integer
 blogid integer
 mentionid integer
 -- with a unique composite index on (clientid, blogid, mentionid) and three foreign key constraints

在第一种情况下,您在integer主键上有索引,在空间坐标轴上也有可选的唯一索引。如果是第二个,则只有三元主键上的唯一索引。在第三种情况下,在integer主键上有一个唯一索引,另外两个非唯一索引,一个在clientid上,另一个在blogid上


第二个选项稍微更高的效率带来的性能增益将是最小的,因此我将根据其他因素做出决定。第三种方法在查询方面最灵活,编码更简单;如果您想在WHERE子句中使用blog而不是client进行查询,那么它提供了client和blog上的索引的好处。至于编码,一些GUI工具和中间件在使用多部分主键时会遇到问题,当必须处理单个整数PK列时,更新/插入/删除逻辑会更简单。我发现代码的简单性和易于维护远比查询响应时间的几秒钟或几秒钟改进要好。

哪些列应该是唯一的?这三个列加在一起。任何一列,不是。@IanC:只是出于好奇,表格描述了什么?一个
提及id
可以属于多个客户或多个博客吗?@Quassnoi它描述了一个提及是如何涉及客户的,并且可能在博客上。一次提及只能连接到一个客户端,可能还有一个博客。Hmmm-我的列顺序错了。@IanC:列顺序本身并不重要,但为什么要在所有三列上都有一个唯一的约束?我相信只有
提到id
应该是唯一的,因为它只连接到一个客户机和一个博客。索引不总是唯一的吗,“唯一索引”真的是“唯一索引键”的误称吗?@vgv8:在内部,所有索引都是唯一的
UNIQUE
表示所有显式键(在索引定义中提供)都是唯一的。如果不是,则某种类型的uniquifier(聚集键/具有uniquifier/
RID
的聚集键)会隐式附加到索引键。@Quassnoi向尚未索引的列添加唯一约束肯定会导致添加唯一索引吗?RDBMS如何确定这些值是否唯一。有趣的是,你回答了这个问题——我不是在问约束:)@IanC:对于当前的系统实现,是的。然而,这(理论上)可以在未来改变。更重要的是:索引可以是不同的类型,通过使用
CONSTRAINT
可以让系统选择类型。我回答这个问题是因为你问我
 MYTABLE
 clientid 
 blogid
 mentionid
 -- with a composite primary key on (clientid, blogid, mentionid) and three foreign key constraints
 MYTABLE
 id integer primary key autoincrement
  clientid integer
  blogid integer
  mentionid integer
  with an index on clientid and also an index on blogid and the three foreign key constraints