我有一个带有主键和两个外键的表,这两个外键都允许NULLS。
当我分别为每两列创建索引时,查询运行大约2-3秒,返回大约300000行。
当我为这两列创建复合非聚集索引时,对于相同数量的行,查询运行大约10分钟。
需要注意的是,WHERE条件和OR子句中出现了两列,如下所示:
Select
SomeColumn
From
SomeTable
Where
FirstColumn = x OR SecondColumn = x执行查询的平台是SQL2008 R2。
为什么在这两种情况下执行时间会有如此大的差异?
发布于 2013-01-16 19:49:18
如果您有两个独立的索引,并且只有这两列在WHERE子句中,那么优化器可以有效地使用它们来确定所需的行(假设是INDEX SEEK)。
复合索引不是很好,因为复合索引首先在第一个索引列上排序,然后在第二个索引列上排序,依此类推。所以它只对OR条件中的第一列有用,就像您得到的一样。要确定第二列的行,优化器必须扫描整个表,因为它没有合适的索引。
它实际上还取决于所选的列、查询复杂性、覆盖索引等。
我自己也有这个问题。有关参考信息,请参阅:Query performance of combined index vs. multiple single indexes vs. fulltext index
发布于 2013-01-16 19:36:18
重点是,索引中列的顺序很重要
create table #temp (col1 int, col2 int )
create nonclustered index index1 on #temp(col1, col2)不同于
create nonclustered index index2 on #temp(col2, col1)与注释中一样,发布查询的执行计划
或更改复合索引中的列顺序,然后重新运行查询
正如评论中所述,我的猜测是,当有两个非聚集索引时- optymizer使用其中一个,如果您删除它们并重新创建为具有低数据选择性的第一列的复合索引,该索引将不会被使用,查询执行时间将受到影响
如果您发布查询,则会容易得多
https://stackoverflow.com/questions/14353901
复制相似问题