Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 复合主键和附加索引_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 复合主键和附加索引

Sql server 复合主键和附加索引,sql-server,sql-server-2005,Sql Server,Sql Server 2005,在SQLServer2005中,我有一个包含两列的表:parent\u id(int)和child id(int)。我想为它们创建一个复合键,因为我只希望表中每个可能的组合都有一个实例 大多数搜索操作将在parent\u id字段上执行,一些搜索操作将在child\u id字段上执行,只有零星的搜索操作同时在两个字段上执行 我计划在parent\u id字段上建立索引,也可能在child\u id字段上建立索引。这是否有意义?或者SQL Server 2005是否能够使用群集复合主键仅对一列(主

在SQLServer2005中,我有一个包含两列的表:
parent\u id(int)
child id(int)
。我想为它们创建一个复合键,因为我只希望表中每个可能的组合都有一个实例

大多数搜索操作将在
parent\u id
字段上执行,一些搜索操作将在
child\u id
字段上执行,只有零星的搜索操作同时在两个字段上执行


我计划在
parent\u id
字段上建立索引,也可能在
child\u id
字段上建立索引。这是否有意义?或者SQL Server 2005是否能够使用群集复合主键仅对一列(主要是
父\u id
)进行索引查找,因此索引不是必需的/不必要的?

使用复合主键(父\u id,子\u id)强制执行唯一性。SQL Server可以在两个列或父\u id上使用组合进行搜索,但不能仅在子\u id上使用组合进行搜索。如果你需要它,就必须创建一个关于child_id的单独索引。

我知道这是一篇老文章,但我也在关注同样的问题。我不明白答案。如果我在ParentID和ChildID上有一个复合键。您如何确定它可以“仅在两列或父\u id上使用组合搜索,但不能仅在子\u id上使用它。如果您需要它”。ParentID和ChildID是相同的,那么它如何使用复合索引来搜索其中一个而不是另一个呢?@mark1234:将其视为一个链。除非首先通过ParentID级别,否则无法达到ChildID级别。这就是为什么仅ChildID上的索引不能使用该索引的原因。查询中没有ParentID筛选器可以让您获得该ChildID。我创建了一个带有ID1和ID2的表,并将其设置为PK,因此使用复合键,然后在where子句中使用ID1进行查询,然后在where子句中使用ID2进行查询,两者都给了我一个聚集索引扫描,这是否意味着我得到了(几乎)性能与在ID1和ID2上使用代理键和单个索引相同(即,两者都将使用索引,而不是执行表扫描)。然后,当我从测试中选择ID2(ID2=1500)时,我放弃了PK并创建了ID1作为PK(ID2上没有索引),即使ID2不再被索引,它仍会执行聚集索引扫描。现在我完全糊涂了。接下来我添加了ID3,并在该列上创建了一个非聚集索引,所以我在ID1(PK)上进行了聚集;ID2上没有任何内容;和ID3上的非集群。当我在ID1和ID3上搜索时,我得到了seeks(我所期望的)。当我在ID2上搜索时,我在ID3上得到一个索引扫描。ID3不在查询中的任何位置,ID2也不是索引中的列。这个答案非常有用,帮助我澄清了这个概念!重要的一点是:父项是复合键中的第一列,而子项是复合键中的第二列(第三、第四……)!