同一列的两个索引并更改顺序

Two indexes for same column and change the order

我在 Microsoft SQL Server 2008 中有一个很大的 table。它有两个索引。一个索引具有 A 列降序,另一个索引具有 A 列与其他一些列的升序。

我的应用程序正在执行以下操作:

  1. Select 备案。
  2. 如果没有记录则插入
  3. 如果找到则更新记录

请注意,此 table 有数百万条记录。

问题是:这些索引会影响任何 select/insert/update 性能吗?

有什么建议吗?

具有完全相同的两个索引,唯一的区别是排序对 SQL 引擎没有影响,只会选择其中一个(实际上)。

假设您有 2 部英语词典,一个将单词从 A 排序到 Z,另一个从 Z 到 A。在这两种情况下,您搜索特定单词所需的工作量大致相同。

另一种情况是,如果您有 2 个人员数据列表,一个按名字然后姓氏排序,另一个按姓氏在前,然后是名字排序。如果您必须查找 "John Doe",按姓氏排在第一位的那个与另一个相比 实际上 没用。

这些示例是 SQL 服务器上索引的非常简化的表示。索引将其数据存储在称为 B 树的结构中,但出于搜索目的,这些示例有助于理解索引何时有用或无用。

恢复:您可以删除第一个索引并保留上面有其他列的索引,因为它可以用于更多不同的场景并且 所有需要另一个的案例。保留一个无用的索引会带来额外的维护任务,例如在每次插入、更新、删除和刷新统计信息时都更新索引,因此您可能想要删除它。

PD:至于使用的第二个索引,这在很大程度上取决于您用来访问特定 table 的查询,它是连接和 where 子句。您可以使用在 SSMS 上突出显示查询的 "Display Estimated Execution Plan" 查看引擎对每个对象执行操作的访问计划。如果使用了索引,你会在那里看到它。

谢谢大家的回答。我探索了 SQL Server ProfilerSQL Tuning Advisor SQL Server 和 运行 他们获得推荐的索引。它推荐了一个包含选项的单一索引。我使用了索引,性能得到了改善