在处理索引时,需要理解一些重要的概念和术语。搜索,扫描和查找是通过select语句使用索引的一些方式。键列的选择性对于确定索引的有效性必不可少。
当SQL Server查询优化器确定查找所需数据的最佳方法是通过扫描索引中的范围时,就会进行查找。当查询被索引“覆盖”时,通常会发生搜索,这意味着搜索谓词在索引键中,而显示的列在键中或包含在内。当SQL Server查询优化器确定查找数据的最佳方法是扫描整个索引,然后过滤结果时,即发生扫描。当索引未在索引键或包含的列中不包括所有请求的列时,通常会发生查找。然后,查询优化器将使用聚簇键(针对聚簇索引)或RID(针对堆)“查找”其他请求的列。
通常,由于物理查询较小的数据集,查找操作比扫描更有效。在某些情况下不是这样,例如很小的初始数据集,但是超出了您的问题范围。
现在,您询问了如何确定索引的有效性,并且需要牢记一些注意事项。聚集索引的键列称为聚集键。这就是在聚集索引的上下文中使记录唯一的方式。默认情况下,所有非聚集索引都将包含聚集键,以便在必要时执行查找。对于每个相应的DML语句,所有索引都将插入,更新或删除。话虽这么说,最好是在select语句中的性能提升与插入,删除和更新语句中的性能影响之间取得平衡。
为了确定索引的有效性,必须确定索引键的选择性。选择性可以定义为不同记录占总记录的百分比。如果我有一个[person]表,该记录包含100条记录,并且[first_name]列包含90个不同的值,则可以说[first_name]列具有90%的选择性。选择性越高,索引键越有效。牢记选择性,最好将最具有选择性的列放在索引键的第一位。使用我以前的[person]示例,如果我们的[last_name]列具有95%的选择性,该怎么办?我们想要创建一个以[last_name],[first_name]作为索引键的索引。
我知道这是一个漫长的回答,但是确实有很多事情要决定索引的有效性,并且必须权衡任何性能提升。