什么是SQL Server的理想索引策略?

mj2*_*008 7 sql sql-server

我和朋友正在开发一个使用SQL Server的新项目.在我之前完成项目的SQL中,我总是将索引放在JOIN或WHERE中使用的任何字段上.

我的朋友只有在他们有性能需求时才添加它们.这个想法是维护索引需要付出代价,并且您希望确保支付这笔费用.可以公平地说,有些查询不会经常使用,而且有些表会比其他表更加积极地添加.

因此,我正在寻找有关数据库索引的"最佳实践"的建议.什么对你有用?

mar*_*c_s 5

我会尝试遵循以下准则:

  • 总是有一个好的主/集群键 - 通常是INT IDENTITY- 避免 GUID 或大型复合 PK/CK。精心挑选的 PK/CK 将大大有助于提高整体性能。要彻底了解原因,请阅读 Kimberly Tripp关于聚类关键选择的所有博客文章

  • 始终索引所有外键列 - 单独或与其他有意义的列一起;这有助于 JOIN 性能

  • 除此之外:少即是多!仅在绝对必要时才添加索引 - 观察系统、分析数据负载、查看性能、微调、再次测量。如果索引有帮助 - 保留它;如果一个索引没有被使用 - 扔掉它

  • 使用手头的 DMV(缺少的索引 DMV 和未使用的索引 DMV)来了解哪些索引可能有帮助,哪些索引根本没有使用......


Kon*_*rak 4

我个人更喜欢主动的方法:根据您的查询,在需要的地方添加索引。正如您所说,在涉及 JOIN 或 WHERE 的字段上。每个索引都会加速读取查询,但会减慢写入速度(因为每次写入都需要更新索引)。因此,对于写入密集型表,可能需要其他解决方案(数据仓库、复制......)。

另一种方法是仅在性能需要时添加索引,只有在进行主动监控时才有效,但即使如此也有一些缺点

  • 您必须向存在性能问题的表添加索引。在添加索引时,您的表被锁定 - 而且它是一个频繁使用的表!
  • 通常在测试时,测试数据比应用程序中的实际数据小几个数量级。瓶颈有被忽视的风险。