场景的简要概述:
我的数据库使用 GUID 作为主键,并且,对于我一直在阅读的内容,在 GUID 上使用聚集索引似乎有点糟糕(增加碎片,减慢插入速度等)。我的项目使用休眠,所以我们通常处理 jpql 并获取完整实体(很多查询最终变成了select p.* from person p [...]
)
我想知道创建覆盖表的所有列的非聚集索引是否是一种好方法(以避免 RID 查找等)。
感谢您的帮助,已经!
场景的简要概述:
我的数据库使用 GUID 作为主键,并且,对于我一直在阅读的内容,在 GUID 上使用聚集索引似乎有点糟糕(增加碎片,减慢插入速度等)。我的项目使用休眠,所以我们通常处理 jpql 并获取完整实体(很多查询最终变成了select p.* from person p [...]
)
我想知道创建覆盖表的所有列的非聚集索引是否是一种好方法(以避免 RID 查找等)。
感谢您的帮助,已经!
不,这不是一个好方法。听起来您已经读过在 GUID 上使用聚集索引是个坏主意。相反,创建一个 int(或 bigint,如果需要)标识字段并使其成为聚集索引,除非另一个字段更有意义。然后只需在 GUID 字段上创建一个非聚集索引,并让 SQL 对使用它的每个查询进行 RID 查找。这样,您可以避免碎片和缓慢的插入/更新/删除。
过早的优化是个坏主意。添加到插入、更新和删除中的数据大小成本和工作是否值得添加索引?除非您测量和测试性能以及索引的影响,否则您不会知道。查看读取该表的查询,看看哪些查询(如果有)长得无法接受。然后调整该特定查询。