编辑:我知道SQL Server会创建一个,我只是在思考在设计/优化过程中是否考虑这个问题是否有意义。
编辑:我知道SQL Server会创建一个,我只是在思考在设计/优化过程中是否考虑这个问题是否有意义。
这个问题的答案取决于你的访问模式。在大多数情况下,你的访问需要单行查找(即寻址)和范围扫描。这些访问模式需要使用B树,否则效率低下。其他一些访问模式,在DW和OLAP中很常见,总是对整个表进行聚合,并且不会从范围扫描中获益。随着进一步的深入,会出现其他要求,比如将数据插入堆和B树中的速度可能对于大型ETL传输作业起到作用。但大多数情况下,答案归结为一个问题:你是在寻址还是范围扫描?绝大多数情况下,答案是肯定的。因此,设计通常需要一个聚集索引。
换句话说:仅仅因为以随机顺序从磁盘读取它很便宜,并不意味着你可以在64GB RAM扫描中破坏你的TLB和L2缓存行...
回复@Matthew PK的评论。
当然,RAM中的位置A和RAM中的位置B一样快。这不是重点。我说的是当你需要的所有数据如果分散在许多页面中,而无法全部放入RAM时的情况。任何给定的页面可能只包含你感兴趣的少量数据。因此,关系型数据库管理系统必须在访问A、B和其他行时不断加载和清除页面。这就是性能损失的原因。
最好的情况是每个页面都充满你感兴趣的数据,希望所有后续的行请求都从RAM中的页面提供服务。使用聚集索引是确保数据被组合到较少页面上的好方法。
是的,它绝对仍然有意义。您在处理中考虑得太低级了。SQL Server(在非常简化的解释中)使用B树架构存储聚集数据。这允许基于聚集索引键值快速检索数据。
堆(没有聚集索引)没有数据的顺序。在这里最重要的事情是,在堆中数据页没有链接在链接列表中。
因此,答案是肯定的,即使在SSD上,仍然有意义在表上创建聚集索引。这完全取决于SQL Server必须筛选多少数据才能获得结果数据。通过聚集索引查找,可以将其最小化。