我应该在聚集索引表上添加非聚集索引,基于此where子句并加入?

时间:2013-11-26 18:49:31

标签: sql sql-server sql-server-2008 tsql

我有一个父表和一个子表。

父表具有聚簇索引作为主键,具有增量值(ParentID)。子表还有一个聚簇索引作为主键,具有增量值(ChildID

主键Parent.parentIDchild.parentID作为外键有关。

我根据以下查询加入这两个表。

Select ....
Join on parent.parentID = child.parentID 
where parent.personalNumber = 197608134356 <-- varchar

现在,我应该

  1. parent.personalNumber上添加非聚集索引,因为它位于where子句中?
  2. 在外键child.parentiD上添加非聚集索引以加快连接速度?
  3. 这意味着我将非聚集索引放在聚簇索引表上。

    我预计随着时间的推移父母和孩子都会有很多行。将有插入和选择。没有更新或删除

    由于 / s的

3 个答案:

答案 0 :(得分:0)

您可以在一个表上只有一个聚簇索引,并且您已经在ParentId上有一个用于Parent表,一个用于Child表上的ChildId,两者都是增量值,这是好的,主键也是好的(不是必需的) ,您可以选择在其他列上使用聚簇索引,在pk上选择非聚集索引。

你的设计很好看。您必须在搜索列上添加非聚簇索引(parent.personalNumber和其他如果有的话)和外键,它通常会有所帮助。

答案 1 :(得分:0)

将聚集索引用于PK,除非您有令人信服的理由不这样做。

该联接仍然可以在孩子上使用群集复合PK 检查执行计划 - 如果连接不使用聚簇索引,我会非常惊讶

personalNumber上的索引应该有助于

答案 2 :(得分:0)

如果您正在设计具有许多并发客户端的高性能,同时全部插入到您的表中 - 您不应该具有基于PK的聚簇索引,该PK也是标识列。有关说明,请参阅此article。为此,会在表格中创建一个热点,从而对性能产生负面影响。

在具有标识列作为PK的表中,几乎总有一个更合适的列基于聚簇索引。