首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引存在于OR子句中的列

索引存在于OR子句中的列
EN

Stack Overflow用户
提问于 2013-01-16 16:15:51
回答 2查看 191关注 0票数 2

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

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

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

需要注意的是,WHERE条件和OR子句中出现了两列,如下所示:

代码语言:javascript
复制
Select 
    SomeColumn
From
    SomeTable
Where 
    FirstColumn = x OR SecondColumn = x

执行查询的平台是SQL2008 R2。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-16 19:49:18

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

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

它实际上还取决于所选的列、查询复杂性、覆盖索引等。

我自己也有这个问题。有关参考信息,请参阅:Query performance of combined index vs. multiple single indexes vs. fulltext index

票数 2
EN

Stack Overflow用户

发布于 2013-01-16 19:36:18

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

代码语言:javascript
复制
create table #temp (col1 int, col2 int )
create nonclustered index index1 on #temp(col1, col2)

不同于

代码语言:javascript
复制
create nonclustered index index2 on #temp(col2, col1)

与注释中一样,发布查询的执行计划

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14353901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档