2

我有一个带有主键和两个外键的表,它们都允许 NULLS。

当我为每两列分别创建索引时,查询运行大约 2-3 秒并返回大约 300000 行。

当我为这两个列创建复合非聚集索引时,对于相同数量的行,查询运行大约 10 分钟。

重要的是要注意两列出现在 WHERE 条件中并与 OR 子句一起使用,如下所示:

Select 
    SomeColumn
From
    SomeTable
Where 
    FirstColumn = x OR SecondColumn = x

执行查询的平台是 SQL 2008 R2。

为什么在这两种情况下执行时间会有如此大的差异?

4

2 回答 2

2

如果您有两个单独的索引,并且只有这两个列在WHERE子句中,那么优化器可以有效地使用它们来确定所需的行(大概是一个INDEX SEEK)。

复合索引不是那么好,因为复合索引首先在第一个索引列上排序,然后是第二个,依此类推。所以它对你的情况的第一列很有用OR,就像你得到的一样。为了确定第二列的行,优化器必须扫描整个表,因为它没有合适的索引。

如果您在这种情况下有一个大表,那么对于您所要求的简单查询,单个索引通常会更快。它实际上还取决于所选列、查询复杂度、覆盖索引等。

我自己也有这个问题。请参阅:组合索引与多个单索引与全文索引的查询性能以供参考。

于 2013-01-16T11:49:18.190 回答
1

关键是,索引中列的顺序很重要

create table #temp (col1 int, col2 int )
create nonclustered index index1 on #temp(col1, col2)

不一样

create nonclustered index index2 on #temp(col2, col1)

如评论中所述,发布查询的执行计划

或更改复合索引中的列顺序并重新运行查询

如评论中所述,我的猜测是,当有两个非聚集索引时-优化器使用其中一个,如果您删除它们并重新创建为具有低数据选择性的第一列的复合索引,则不会使用该索引,并且查询执行时间将遭受

如果您发布查询会容易得多

于 2013-01-16T11:36:17.623 回答