sql-server - SQL Server 中 GUID 类型列上非聚集索引的使用

标签 sql-server tsql optimization indexing foreign-keys

我想优化我的团队用于应用程序的数据库的性能。

我一直在寻找添加外键的区域,然后对这些列建立索引以提高连接的性能。但是,我们的许多表都连接在 GUID 类型的 id 上,该 id 在插入项目时生成,并且其他表中与该项目关联的数据通常具有列 item_id 包含 GUID。

我读到,向 GUID 类型列添加聚集索引是一个非常糟糕的决定,因为索引需要不断重建才能有效。但是,我想知道,在上述场景中使用非聚集索引是否有任何损害?或者假设这有助于提高性能是否合理?如果需要,我可以提供更多信息。

最佳答案

<anytype> 上的索引是迄今为止改进连接和单例查找的最佳选择。如果缺少此索引,查询将始终必须端到端扫描整个表,并且(通常)性能结果很糟糕,并发性也付诸东流。

确实是uniqueidentifier由于您提到的原因,索引的选择很糟糕,但这绝不意味着您不应该创建这些索引。如果可能的话,建议将数据类型更改为 INT 或 BIGINT。使用 NEWSEQUENTIALID() UuidCreateSequential 生成它们将有助于解决碎片问题。如果所有替代方案都失败,您可能需要比其他索引更频繁地执行索引维护(重建、重新组织)操作。 但这些缺点绝对不能超过将索引放在首位的好处!

关于sql-server - SQL Server 中 GUID 类型列上非聚集索引的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803326/

相关文章:

sql-server - 如何获得多个日期时间值的总和?

c - 为什么 gcc 会创建冗余的汇编代码?

c++ - 从非常大的未排序列表中获取最大 X 数的最快方法?

sql-server - 配置单元加载 CSV : load part of columns (or column mapping)

sql-server - 验证 SQL 中的列表输入

sql - 在 MS SQL Server 中隐藏表中的列

sql-server - 在 T-SQL 中反序列化 XML 对象

python - 控制 python 导入以减少大小和开销

sql - 相交删除

sql-server - 触发器 - 是否需要 BEGIN/COMMIT TRAN