Sha*_*pta 3 sql t-sql sql-server indexing
我知道如何使用索引(clustured和non clustured)但是什么时候我应该在我的表中使用非clustured索引.应该有哪些场景,以便使我的列不受限制.我已经完成了msdn指南,但仍然有点混乱.
我应该只将唯一的列作为NC制作,还是应该将其他列作为NC.
如果我用NC索引重载我的表,那么它也会降低我的表现吗?
我应该在作为外键的列上使用复合非C索引.
我知道主键应该是Clustured,唯一键应该是NC但是外键呢.
该聚集索引定义你的表的物理结构(在一定程度上) -例如,它在什么样的顺序数据是有序的定义.想想通过(LastName,FirstName)"聚集"的电话簿 - 至少在大多数国家都是如此.
每个表只能获得一个聚簇索引 - 所以明智地选择它!根据索引女王金伯利·特里普的福音,聚类键应该是狭窄的,稳定的(永不改变),独特的(是的!)并且理想地不断增加.
它应该很窄,因为聚类键将被添加到每个非聚集索引的每个条目中 - 毕竟,聚类键是用于最终查找实际数据的值.
它应该是稳定的,因为不断更新大量的索引值是一件代价高昂的事情 - 特别是因为集群密钥也必须在所有非聚集索引中更新.
它需要是唯一的,因为它再次 - 它最终用于定位实际数据的价值.如果您选择的列不能保证唯一,SQL Server将通过向其添加4字节值来"统一"您的群集密钥 - 这不是一件好事.
理想情况下,群集密钥应该不断增加,因为这会导致页面和索引碎片最少,因此最适合性能.
聚类密钥的理想候选者是INT(或BIGINT)IDENTITY - 它理想地满足所有这些要求.
至于非聚集索引 - 明智地使用和选择它们!我只能给你一条通用规则:作为外键一部分的所有列(引用另一个表)应该在索引中 - SQL Server不会(与流行的看法和许多神话相反)放置这样的索引自动 - 永远不会,永远不会.
除此之外 - 你需要观察你的系统,看看你有什么样的查询 - 在WHERE或SORT子句中显示的所有列都是可能被索引的候选者 - 但是太多的索引也不是一件好事. ..