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

SQL Server的理想索引策略是什么?,sql,sql-server,Sql,Sql Server,我和一个朋友正在做一个使用SQL Server的新项目。在我以前完成的SQL项目中,我总是将索引放在联接或WHERE中使用的任何字段上 我的朋友只是在需要性能时才添加了它们。其想法是维护索引是有成本的,您希望确保支付该成本是值得的。公平地说,有些查询不会经常使用,而且有些表将比其他表更积极地添加到 因此,我正在寻找关于数据库索引的“最佳实践”是什么的建议。什么最适合您?设计索引时,请遵循以下准则: 在具有多行的表上以及在中使用的列上使用索引 查询的WHERE子句或在表中 联接、和在ORDER

我和一个朋友正在做一个使用SQL Server的新项目。在我以前完成的SQL项目中,我总是将索引放在联接或WHERE中使用的任何字段上

我的朋友只是在需要性能时才添加了它们。其想法是维护索引是有成本的,您希望确保支付该成本是值得的。公平地说,有些查询不会经常使用,而且有些表将比其他表更积极地添加到


因此,我正在寻找关于数据库索引的“最佳实践”是什么的建议。什么最适合您?

设计索引时,请遵循以下准则:

  • 在具有多行的表上以及在中使用的列上使用索引 查询的WHERE子句或在表中 联接、和在ORDER BY中使用的列上 并按查询分组
  • 避免在频繁更新的列上使用不频繁的索引。在里面 此外,避免在上有许多索引 经常更新的表。 否则,您将不必要地增加 服务器的插入和更新时间 查询。为了提高绩效, 尽量减少管道的总宽度 索引列
  • 适当地使用聚集索引和非聚集索引。了解 选择每种方法的目的,并选择正确的方法 为您的场景键入
  • 使用覆盖索引减少频繁查询的执行时间 使用的语句。覆盖指数是一种 具有所有 WHERE子句中的列 和在查询列选择中
根据


您只想将它们放在那些有大量查询的列或列组上。您可以从SQL Server获取大量统计信息,以查看针对您的表运行的查询,SQL Server甚至会在您没有索引的地方建议索引


这里有一个很好的链接,里面有一些有用的信息,还有其他一些链接

我个人偏好的是“主动”方法:根据您的查询,在需要的地方添加索引。正如您所说,在涉及连接或where的字段上。每个索引都会加快读取查询,但会降低写入速度(因为每次写入都需要更新索引)。因此,对于写密集型表,可能需要其他解决方案(数据仓库、复制…)

另一种方法,只在性能需要的地方添加索引,只有在进行主动监视时才有效,但即使这样也有一些缺点:

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

    • 你的问题没有简单的答案。这一切都归结于桌子的使用。监视表的使用将告诉您该做什么

      select * from sys.dm_db_missing_index_details
      
      了解您的动态管理视图

      然后从此URL转到并使用此存储过程


      还有。。homedude关于“covered indexes”的说法确保您理解covered indexes(SQL 2000)与包含子句的索引(SQL 2005及更新版本)之间的区别。

      索引最好放在尽可能唯一的值上。例如,在一列中50%的列为值“a”,而另50%的列为值“B”的列上放置索引是无用的

      这样,在选择正确的值之前,表将扫描至少50%的记录

      因此,最佳做法是将索引放在最唯一的列上,并且只放在用于选择查询的列上


      示例:如果要为典型的“登录”创建一个select,则应在“用户名”列上放置一个索引,以确保用户名是唯一的。

      我将尝试遵循以下准则:

      • 始终使用良好的主/群集键-通常是
        INT-IDENTITY
        -避免GUID或大的复合主键/CK。精心选择的PK/CK将大大有助于提高整体性能。要彻底了解原因,请阅读金伯利·特里普的所有选择

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

      • 除此之外:少就是多!只有在您绝对必须的情况下才添加索引-观察您的系统、分析您的数据负载、查看性能、微调、再次测量。如果索引有帮助,请保存它;如果索引没有被使用-扔掉它

      • 使用DMV的手(的)得到一个什么样的指数可能有帮助的想法,哪些是没有被使用的所有


      我想,就在你写评论之前,我编辑了我的解决方案。我仔细阅读了一遍,完全看到了您刚才提到的内容。拇指规则可以在锤子下获得-索引也可以用于检索数据-因此,即使您有50-50个数据,某些查询也可以从索引中受益-例如COUNT(*)。。。哪里…='A'必须只读取索引。所以它不一定没用。我找到了这张桌子,但它是空的。是否有需要启用的选项来填充它?我从未见过一台生产服务器有空的DMW。你是在Dev做这件事吗?另一种方法是使用SQL profiler(针对生产)捕获跟踪,然后使用数据库调优顾问测试此工作负载的性能。我通常确保在它运行时不会将其保存到文件/表中,但是当SQL profiler跟踪完成时(当您点击stop时),就可以将跟踪结果保存到表中。我只是觉得在跟踪结束时做这件事比在跟踪开始时做要好得多