首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IN和OR的SQL性能问题

问IN和OR的SQL性能问题
EN

Stack Overflow用户
提问于 2009-11-09 21:10:49
回答 8查看 145关注 0票数 3

假设有一个sql,在SP某些部分,有一个WHERE子句,它查找两个ID;

..。其中ID IN (123,1245)

如果我使用OR而不是IN;

我会得到什么或失去什么。或者它们都是相等的?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-11-10 06:38:08

Oracle、SQL Server和MySQL将为这两个查询生成相同的计划。

如果有问题的字段没有索引,这只是一个普通的过滤器。

如果字段已编入索引,并且优化程序选择了索引查找:

  • Oracle使用INLIST ITERATOR
  • SQL Server使用CONSTANT SCAN
  • MySQL使用range访问方法

PostgreSQL生成名义上不同的计划:第一种情况下具有两个索引条件的OR,第二种情况下只有一个索引条件ANY(123, 1245):INTEGER[]。

然而,这在实践中也没有区别。

请注意,这两个查询将始终对两个值使用相同的访问方法,而使用不同的访问方法可能更有效。

一些查询可能会从将它们重写为联合中受益:

代码语言:javascript
复制
SELECT  *
FROM    mytable
WHERE   id = 123
        AND …
UNION ALL
SELECT  *
FROM    mytable
WHERE   id = 1245
        AND …

根据字段的选择性,这可能会(也可能不会)为两个查询生成不同的执行计划,从而可能(也可能不会)获得效率。

票数 2
EN

Stack Overflow用户

发布于 2009-11-09 21:25:12

有一个excellent article 讨论了类似的问题(不是IN、EXISTS和LEFT JOIN)。基本上,它表明它们非常相似,不同的优化器很好地处理了这些问题。

我预计优化器会处理您提到的两种替代方案,从而导致类似的执行计划。如果存在差异,请与EXPLAIN PLAN检查。

票数 3
EN

Stack Overflow用户

发布于 2009-11-09 21:20:53

回到我在学校的时光:我被教导IN (...,..)在执行SQL之前,表达式被分解成一组OR语句。

它看起来只是一个更全面的代码。

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

https://stackoverflow.com/questions/1700903

复制
相关文章

相似问题

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