问题 复合主键和附加索引


在SQL Server 2005中,我有一个包含两列的表: parent_id (int) 和 child id (int)。我想制作一个复合键,因为我只希望表中每个可能的组合只有一个实例。

大多数搜索操作都将在 parent_id 田野,一些在 child_id 两个领域只有零星的一起。

我计划在上面写一个索引 parent_id 田野,也许还有一个 child_id 领域。这是有意义的还是SQL Server 2005能够在一列上使用聚簇复合主键进行索引查找(主要是 parent_id)因此指数是不必要/可有可无的?


7001
2017-12-07 21:44


起源



答案:


使复合主键(parent_id,child_id)强制实施唯一性。 SQL Server可以将复合用于仅对列或parent_id进行搜索,但不能仅将其用于对child_id进行搜索。如果需要,必须在child_id上创建单独的索引。


16
2017-12-07 22:09



我知道这是一个老帖子,但我正在看同样的问题。我不明白答案。如果我在ParentID和ChildID上有一个复合键。你如何确定它可以“仅在列上使用复合词进行搜索,或仅使用parent_id,但它不能仅用于搜索child_id。如果你需要它”。 ParentID和ChildID是相同的,那么它如何使用复合索引来搜索一个而不是另一个? - mark1234
@ mark1234:把它想象成一个链条。除非您首先通过ParentID级别,否则无法达到ChildID级别。这就是为什么只有ChildID的索引不能使用索引。查询中没有ParentID过滤器可以帮助您了解该ChildID。 - Joe Stefanelli
我创建了一个ID1和ID2的表,并使其成为PK,所以复合键然后在where子句中使用ID1查询,然后在where子句中使用ID2,它们都给了我一个聚簇索引扫描,这是否意味着我得到了(几乎与在ID1和ID2上具有代理键和单个索引的性能相同(即两者都将使用索引而不是进行表扫描)。然后我删除了PK并创建了ID1作为PK(ID2上没有索引)当我选择ID2来自Test时ID2 = 1500它仍然进行聚簇索引扫描,即使ID2不再被索引。现在我完全糊涂了。 - mark1234
接下来我添加了ID3并在该列上创建了一个非聚集索引,因此我已经聚集在ID1(PK)上; ID2没什么; ID3上没有群集。当我搜索ID1和ID3时,我得到了寻求(我期待的)。当我在ID2上搜索时,我在ID3上进行索引扫描。 ID3不在查询中的任何位置,ID2不是索引中的列。是什么赋予了? - mark1234
这个答案就在这里 stackoverflow.com/a/389545/3569421 非常有用,并帮助我澄清了这个概念!重要的一点是:PARENT是复合键中的第一列,而CHILD是复合键中的第二列(第三,第四......)! - carlosrafaelgn


答案:


使复合主键(parent_id,child_id)强制实施唯一性。 SQL Server可以将复合用于仅对列或parent_id进行搜索,但不能仅将其用于对child_id进行搜索。如果需要,必须在child_id上创建单独的索引。


16
2017-12-07 22:09



我知道这是一个老帖子,但我正在看同样的问题。我不明白答案。如果我在ParentID和ChildID上有一个复合键。你如何确定它可以“仅在列上使用复合词进行搜索,或仅使用parent_id,但它不能仅用于搜索child_id。如果你需要它”。 ParentID和ChildID是相同的,那么它如何使用复合索引来搜索一个而不是另一个? - mark1234
@ mark1234:把它想象成一个链条。除非您首先通过ParentID级别,否则无法达到ChildID级别。这就是为什么只有ChildID的索引不能使用索引。查询中没有ParentID过滤器可以帮助您了解该ChildID。 - Joe Stefanelli
我创建了一个ID1和ID2的表,并使其成为PK,所以复合键然后在where子句中使用ID1查询,然后在where子句中使用ID2,它们都给了我一个聚簇索引扫描,这是否意味着我得到了(几乎与在ID1和ID2上具有代理键和单个索引的性能相同(即两者都将使用索引而不是进行表扫描)。然后我删除了PK并创建了ID1作为PK(ID2上没有索引)当我选择ID2来自Test时ID2 = 1500它仍然进行聚簇索引扫描,即使ID2不再被索引。现在我完全糊涂了。 - mark1234
接下来我添加了ID3并在该列上创建了一个非聚集索引,因此我已经聚集在ID1(PK)上; ID2没什么; ID3上没有群集。当我搜索ID1和ID3时,我得到了寻求(我期待的)。当我在ID2上搜索时,我在ID3上进行索引扫描。 ID3不在查询中的任何位置,ID2不是索引中的列。是什么赋予了? - mark1234
这个答案就在这里 stackoverflow.com/a/389545/3569421 非常有用,并帮助我澄清了这个概念!重要的一点是:PARENT是复合键中的第一列,而CHILD是复合键中的第二列(第三,第四......)! - carlosrafaelgn