tho*_*ulb 76 sql t-sql database clustered-index sql-server-2008
如果聚簇索引不是唯一的,会发生什么?是否会导致性能不佳,因为插入的行会流向某些类型的"溢出"页面?
它是"独特的",如果是这样的话怎么样?使它独一无二的最佳方法是什么?
我问,因为我目前正在使用聚集索引来划分逻辑部分中的表,但性能是如此,最近我得到了使我的聚簇索引唯一的建议.我想就此发表第二个意见.
谢谢!
Lie*_*ers 79
他们不具有是唯一的,但可以肯定的是鼓励.
我还没有遇到过我想在非唯一列上创建CI的场景.
如果您在非唯一列上创建CI,会发生什么
如果聚簇索引不是唯一索引,则SQL Server通过添加称为唯一符的内部生成值使任何重复键唯一
这会导致糟糕的表现吗?
添加唯一符肯定会增加计算和存储它的开销.
如果这种开销将是显着的取决于几个因素.
按照Remus在评论中指出的编辑,确实存在创建非唯一CI的用例,这是一个合理的选择.我没有遇到过这些场景只是表明我自己缺乏曝光或能力(选择你的选择).
mar*_*c_s 25
我想看看索引女王金伯利·特里普在这个话题上说的话:
我将从我对Clustering Key的建议开始 - 出于几个原因.首先,这是一个简单的决策,其次,早期做出这个决定有助于主动防止某些类型的碎片.如果您可以阻止某些类型的基表碎片,那么您可以最小化一些维护活动(其中一些在SQL Server 2000中,而在SQL Server 2005中较少,需要您的表脱机).好的,我稍后会去重建的东西......
让我们从集群密钥中寻找的关键事项开始:
* Unique
* Narrow
* Static
Run Code Online (Sandbox Code Playgroud)
独特之处? 集群密钥应该是唯一的,因为集群密钥(如果存在)用作来自所有非集群索引的查找密钥.以图书背面的索引为例 - 如果您需要查找索引条目指向的数据 - 该条目(索引条目)必须是唯一的,否则哪个索引条目将是您要查找的条目?因此,在创建聚簇索引时 - 它必须是唯一的.但是,SQL Server不要求在唯一列上创建群集密钥.您可以在任何您想要的列上创建它.在内部,如果群集密钥不是唯一的,那么SQL Server将通过向数据添加4字节整数来"取消它".因此,如果聚簇索引是在不唯一的东西上创建的,那么不仅在创建索引时会产生额外的开销,还会浪费磁盘空间,
资料来源: 不断增加的聚类重点辩论 - 再次!
聚集索引必须是唯一的吗?
他们没有,而且有时候如果他们不这样做会更好.
考虑一个具有半随机,唯一EmployeeId的表和每个雇员的DepartmentId:如果您的select语句是
SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%
Run Code Online (Sandbox Code Playgroud)
如果DepartmentId是聚簇索引,那么它最好是性能,即使(或者甚至特别是因为)它不是唯一索引(最适合性能,因为它确保给定DepartmentId中的所有记录都是聚类的).
你有什么参考吗?
有聚集索引设计指南例如,它说,
除少数例外情况外,每个表都应在列或列上定义聚簇索引,以提供以下内容:
- 可用于常用查询.
- 提供高度的独特性.
- 可用于范围查询.
例如,我对"高度独特性"的理解是,如果大多数查询想要选择给定城镇内的记录,选择"国家"作为结果索引是不好的.
| 归档时间: |
|
| 查看次数: |
63933 次 |
| 最近记录: |