将聚簇索引放在连接使用列和重扫描列上?

时间:2013-06-27 22:52:20

标签: sql-server performance

我有这个简单的表格:

Users

userId    |  name    
--------------------- 
 1             'a1'   
 2             'a2'    
 3             'a3'    
 4             'a4'    
 5             'a5'     

Cities

cityId    |  name    
--------------------- 
 1             'c1'   
 2             'c2'    
 3             'c3'    
 4             'c4'    
 5             'c5'   

每个用户可以比一个城市更多。 :

所以映射表是:

userId    |  CityId    
------------------------------------
 1             4    
 1             4    
 1             4    
 2             5    
 5             6    

users按名称进行了大量扫描。

问题:

对于映射表,我没有问题。两列一起是主/聚簇索引。

但我正在努力解决前两张桌子的问题:

  • 我认为用户应该将userId列作为主键。为什么?因为它是通过连接到映射表使用的。
  • 但我还需要在name列上使用聚簇索引,因为该表会按名称进行大量扫描。

(不考虑这个独特的问题。假设所有列都是唯一的)

此案例的最佳做法决定是什么?

1 个答案:

答案 0 :(得分:2)

最佳决策取决于您使用查询返回的数据的准确程度。

聚簇索引意味着页面文件中的数据是根据此索引排序的。

常规索引将拥有自己的页面文件来命令索引和指向物理行的指针。

因此,聚簇索引将更好地为那些返回值范围而不是唯一行的查询提供服务。

因此,除非您在like列上对Name操作执行大量查询,否则最好将聚簇索引保留在ID列上,因为此索引将不断扫描并用于返回记录集以支持您的联接操作。