为sql Server定义索引(集群和非群集)时,您会考虑什么? DB新手应该注意什么反模式?请解释“为什么”,如果可能,请提供参考.
解决方法
索引基本上是“备忘单”.它允许DBMS在磁盘上找到特定值(或值的范围),而不必扫描整个表.一般来说,你通过一个索引来支付一些INSERT / UPDATE / DELETE的罚款,但很少有这样的一个瓶颈.一个好的DBMS只能在查询性能时使用索引,所以在这里没有很多非常消极的反模式.如果您有额外的索引(除非你在谈论非常高的事务表),通常不会伤害你.也就是说,全面的索引将帮助您确保真正重要的索引在那里,最好的方法是通过对应用程序进行分析.
了解什么时候和什么时候不使用索引的关键是要了解他们在封面下真正做什么.简而言之,当索引的选择性较高时(即不同的可能值的数量与关系的大小相比较高),您需要它们.所以,例如,如果你有一个有10,000行的表,并且在该表上有一个名为“color”的列是“red”或“blue”,那么索引就没有什么帮助,因为DBMS很可能不得不将大部分页面加载到内存中(假设随机分配).相反,表的主键ID(几乎总是自动添加)的索引将使得该表中的查找将以log(n)的顺序快速减轻 – 因为树中的少量节点必须被检查以查找磁盘上记录所在的页面.
大多数现代数据库系统中的索引都使用B树实现,B树是B-Trees非常酷的变体,它针对慢二级存储(磁盘而不是内存)进行了优化.您可以从Database Systems: The Complete Book获得对其使用和功能的良好介绍.