Sql 在vs=运算符中使用时对非主键列使用聚集索引
如果我的产品表有CategoryId列,我知道将CategoryId设置为聚集索引而不是主键ProductId是一种很好的做法Sql 在vs=运算符中使用时对非主键列使用聚集索引,sql,clustered-index,Sql,Clustered Index,如果我的产品表有CategoryId列,我知道将CategoryId设置为聚集索引而不是主键ProductId是一种很好的做法 如果我对Product表的大多数查询看起来像select*from Product where CategoryId in(1,2)而不是更典型的select*from Product where CategoryId=1请非常小心地选择聚集索引!它非常特殊——每个表只能有一个表,它决定了数据的物理顺序,并用于唯一标识数据页的位置(“行指针”,如果您愿意的话) 此外,它
如果我对Product表的大多数查询看起来像
select*from Product where CategoryId in(1,2)
而不是更典型的select*from Product where CategoryId=1
请非常小心地选择聚集索引!它非常特殊——每个表只能有一个表,它决定了数据的物理顺序,并用于唯一标识数据页的位置(“行指针”,如果您愿意的话)
此外,它是SQL Server数据库中复制次数最多的数据结构(假设您正在谈论的是SQL Server)。集群键也将是表中每个非集群索引的一部分——当然是在叶级,也可能是在索引导航结构中
在选择群集键时应格外小心-它应该是:
- 窄(理想情况下为4字节)
- unique(它毕竟是“行指针”——如果您不使其唯一,SQL Server将——对您来说——在后台——为每个条目花费几个字节——乘以您拥有的行数和非聚集索引数——可能非常昂贵!)
- 静态(如果可能,永不更改)
- 理想情况下,不断增加,这样就不会出现可怕的索引碎片(GUID与良好的集群键完全相反-出于特定原因)
- 它应该是不可为null的,并且理想情况下也可以使用-a
来修复它,这使得集群键非常糟糕varchar(250)
产品
表上选择类别ID
听起来不是一个好主意。产品的类别可能会改变,它很可能不是唯一的,因此我认为它不会真正成为一个好的集群键
此外,一个产品的类别听起来也不是很有选择性,所以它甚至可能不是一个好的非聚集索引。如果某个特定查询返回的行数超过总行数的1-5%,那么SQL查询优化器无论如何都不会使用大多数索引(因为它们返回的数据太多)。这是我第一次阅读这个问题,但我发誓我在某处读到了完全相同的答案。你只是在复制和粘贴你的答案吗?哈哈,回答和文章都很棒,谢谢。对一个唯一键进行聚类是非常不直观的-我将不得不再读几遍。“Products表上的CategoryId听起来不是一个很好的主意…它很可能不是唯一的”--我假设它们是指按该顺序对
(CategoryId,ProductId)
组合进行聚类索引,仅按CategoryId
搜索时,结果将大部分位于相同的物理页面上。@某天:在(CategoryId,ProductId)
上的该化合物将是一个更好的选择,是的!