gpt4 book ai didi

sql - OR 子句中存在的索引列

转载 作者:行者123 更新时间:2023-12-04 05:15:16 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

我自己也有这个问题。见:Query performance of combined index vs. multiple single indexes vs. fulltext index供引用。

关于sql - OR 子句中存在的索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14353901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com