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

时间:2019-01-29 07:26:04

标签: sql performance indexing sql-server-2008-r2

我在Microsoft SQL Server 2008中有一张大表。它有两个索引。一个索引具有A列的降序,而另一个索引具有A列的升序。

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

  1. 选择记录。
  2. 如果没有记录,则插入
  3. 如果找到,则更新记录

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

问题是:这些索引会影响任何选择/插入/更新性能吗?

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

一种不同的情况是,如果您有2个人的数据列表,一个列表按名字排序,然后按姓氏排序,另一个按姓氏排序,然后按名字排序。如果您必须寻找“ John Doe”,那么与另一个名字相比,姓氏第一个排序的东西实际上没用

这些示例是SQL Server上索引的非常简化的表示形式。索引将数据存储在称为B树的结构中,但是出于搜索目的,这些示例可以理解索引何时有用。

继续:您可以删除第一个索引,并保留上面带有其他列的索引,因为它可以用于更多不同的情况,并且 将需要另一个。保留无用的索引会带来其他维护任务,例如使索引在每次插入,更新,删除和刷新统计信息时都保持更新,因此您可能希望删除它。

PD:至于正在使用的第二个索引,这在很大程度上取决于您用于访问该特定表的查询,它的联接和where子句。您可以使用在SSMS上突出显示查询的“显示估计的执行计划”来查看引擎对每个对象执行操作的访问计划。如果使用了索引,您将在此处看到它。

答案 1 :(得分:0)

感谢所有答案。我探索了用于SQL Server的 SQL Server Profiler SQL Tuning Advisor 并运行它们以获取推荐的索引。它建议使用包含选项的单个索引。我使用了索引,并且性能得到了改善