Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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 在vs=运算符中使用时对非主键列使用聚集索引_Sql_Clustered Index - Fatal编程技术网

Sql 在vs=运算符中使用时对非主键列使用聚集索引

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请非常小心地选择聚集索引!它非常特殊——每个表只能有一个表,它决定了数据的物理顺序,并用于唯一标识数据页的位置(“行指针”,如果您愿意的话) 此外,它

如果我的产品表有CategoryId列,我知道将CategoryId设置为聚集索引而不是主键ProductId是一种很好的做法


如果我对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)
上的该化合物将是一个更好的选择,是的!