什么更有效,in子句或or子句,索引是否仍然被使用?

时间:2012-09-17 14:45:45

标签: sql openedge

假设我有一个customers表,其中包含account_numberbilling_account_number,如果我链接到另一个我需要测试的表,我可以使用以下或子句:

select c.name
  from customers c
 ,left join credit_terms ct on account = c.account_number
                            or account = c.billing_account

但是,我发现以下内容同样适用

select c.name
  from customers c
 ,left join credit_terms ct on account in (c.account_number, c.billing_account)

现在假设credit_terms.account已编入索引,是否会在两种情况下都使用该索引?这两种说法都是一样的吗?是否有任何费用与其中一个相关?

我为天真道歉,虽然我对中等水平的SQL很新。

2 个答案:

答案 0 :(得分:1)

OpenEdge使用基于成本的优化程序,因此特定查询计划将受与查询相关的统计信息的影响 - 它可能会也可能不会使用您期望的索引,具体取决于优化程序对数据的了解。 / p>

这篇知识库文章解释了OpenEdge的SQL查询计划:

http://progresscustomersupport-survey.force.com/ProgressKB/articles/Article/P62658?retURL=%2Fapex%2FProgressKBHome&popup=false

您还必须定期更新优化程序的SQL统计信息,以便做得很好:

http://progresscustomersupport-survey.force.com/ProgressKB/articles/Article/20992?retURL=%2Fapex%2Fprogresskbsearch&popup=false

答案 1 :(得分:0)

我不知道openge,但我不认为任何人都会在帐户上使用索引。其中两个基本相同。

如果你想使用索引,我会做这样的事情:

select c.name
  from customers c
  left join credit_terms ct on ct.account = c.account_number
union
select c.name
  from customers c
  left join credit_terms ct on ct.account = c.billing_account

然后再次,这是某种推测,正如我再说一次,我不知道openge。