假设有一个sql,在SP某些部分,有一个WHERE子句,它查找两个ID;
..。其中ID IN (123,1245)
如果我使用OR而不是IN;
我会得到什么或失去什么。或者它们都是相等的?
发布于 2009-11-10 06:38:08
Oracle、SQL Server和MySQL将为这两个查询生成相同的计划。
如果有问题的字段没有索引,这只是一个普通的过滤器。
如果字段已编入索引,并且优化程序选择了索引查找:
Oracle使用INLIST ITERATORSQL Server使用CONSTANT SCANMySQL使用range访问方法PostgreSQL生成名义上不同的计划:第一种情况下具有两个索引条件的OR,第二种情况下只有一个索引条件ANY(123, 1245):INTEGER[]。
然而,这在实践中也没有区别。
请注意,这两个查询将始终对两个值使用相同的访问方法,而使用不同的访问方法可能更有效。
一些查询可能会从将它们重写为联合中受益:
SELECT *
FROM mytable
WHERE id = 123
AND …
UNION ALL
SELECT *
FROM mytable
WHERE id = 1245
AND …根据字段的选择性,这可能会(也可能不会)为两个查询生成不同的执行计划,从而可能(也可能不会)获得效率。
发布于 2009-11-09 21:25:12
有一个excellent article 讨论了类似的问题(不是IN、EXISTS和LEFT JOIN)。基本上,它表明它们非常相似,不同的优化器很好地处理了这些问题。
我预计优化器会处理您提到的两种替代方案,从而导致类似的执行计划。如果存在差异,请与EXPLAIN PLAN检查。
发布于 2009-11-09 21:20:53
回到我在学校的时光:我被教导IN (...,..)在执行SQL之前,表达式被分解成一组OR语句。
它看起来只是一个更全面的代码。
https://stackoverflow.com/questions/1700903
复制相似问题