Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
搜索字段上的TSQL索引,是否应包含Id_Tsql_Database Indexes - Fatal编程技术网

搜索字段上的TSQL索引,是否应包含Id

搜索字段上的TSQL索引,是否应包含Id,tsql,database-indexes,Tsql,Database Indexes,假设我有一个典型的客户表 Id Int Identity Primary Key, FirstName varchar(255), LastName varchar(255), Phone VarChar(30) 所以主键在Id上创建一个聚集的唯一索引 为了加快搜索速度,我想在名称字段中添加索引 我的问题是,我是应该将Id添加到这些索引中,还是这些索引将自己绑定到主键上 比如, Create Index IX_Customer_FirstLastName On Customers(Fir

假设我有一个典型的客户表

Id Int Identity Primary Key, 
FirstName varchar(255), 
LastName varchar(255), 
Phone VarChar(30)
所以主键在Id上创建一个聚集的唯一索引

为了加快搜索速度,我想在名称字段中添加索引

我的问题是,我是应该将Id添加到这些索引中,还是这些索引将自己绑定到主键上

比如,

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName, Id)
。。。那是不是太过分了

以下方法是否更有效

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName)

TIA

ID
添加到其他索引中是没有意义的。只有当您有大量行具有相同的
firstName
lastName
组合,并且您已经知道
ID
时,这才有帮助

但是,如果您已经知道要搜索的记录的
ID
,则可以使用聚集索引进行搜索

此外,每个非聚集索引已经包含聚集索引的值,以便在使用非聚集索引找到行后,可以使用聚集索引查找该行


最后请注意,如果使用
FirstName
LastName
创建单个索引,则此索引将仅用于包含索引前缘的
FirstName
的搜索。如果您计划仅使用
LastName
FirstName
执行搜索,请创建两个索引,每列一个。

您将搜索什么?始终使用全名/姓氏,或者单独使用,或者…?其实这更像是一个普通问题。将主键字段放在表上的任何其他索引上有什么好处吗?通常没有,来自@MichaelFredrickson的答案几乎涵盖了这一点。感谢您的输入JoachimThanks Michael,非聚集索引指向聚集索引的事实回答了我的问题。如果可以的话,我只想稍微扩展一下这个问题。如果主键是唯一标识符,出于性能原因,我会将其设置为非集群。那么,您是否仍然建议将ID从后续索引中删除?我仍然不会将
ID
作为索引的一部分,如果您需要更改ID以使索引覆盖,那么这是合理的。。但我假设这种情况可能不太可能发生,并且您可能不需要出于这个原因包含ID。但是,我建议不要让你的PK成为唯一标识符,因为。谢谢Michael,在一个项目中选择唯一标识符是我无法控制的。我至少把它们的聚集索引转换成了非聚集索引!