Sql in子句还是or子句更有效,索引是否仍然被使用?

Sql in子句还是or子句更有效,索引是否仍然被使用?,sql,openedge,Sql,Openedge,假设我有一个customers表,该表有一个account\u number和一个billing\u account\u number,如果我链接到另一个需要测试的表,我可以使用以下or子句: select c.name from customers c ,left join credit_terms ct on account = c.account_number or account = c.billing_account 然而

假设我有一个
customers
表,该表有一个
account\u number
和一个
billing\u account\u number
,如果我链接到另一个需要测试的表,我可以使用以下or子句:

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\u terms.account
已编制索引,该索引是否会在这两种情况下都使用?这两种说法一样吗?是否存在与其中一项或另一项相关的成本


我为自己的幼稚表示歉意,尽管我对SQL的中等水平还相当陌生。

我不知道openedge,但我不认为任何一方会使用索引。他们两个基本上是一样的

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

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

再说一遍,这在某种程度上是一种推测,正如我再次说的,我不知道openedge。

我不知道openedge,但我不认为任何一方会考虑使用索引。他们两个基本上是一样的

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

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

同样,这是一种推测,正如我再次说过的,我对openedge一无所知。

openedge使用基于成本的优化器,因此特定的查询计划将受到与查询相关的统计信息的影响——它可能使用,也可能不使用您期望的索引,这取决于优化器对数据的了解程度

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

您还必须定期更新SQL统计信息,以便优化器做好以下工作:


OpenEdge使用基于成本的优化器,因此特定的查询计划将受到与查询相关的统计信息的影响——根据优化器对数据的了解,它可能使用或不使用您期望的索引

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

您还必须定期更新SQL统计信息,以便优化器做好以下工作:


我刚刚确定这可能是的副本,但我想知道这些值是否为常量。在
选择列表中是否只有
c.name
?@ypercube,不一定。这只是一个非常基本的查询,我用它来表达一个简单的案例,我已经讲了很多。通常会有更多的字段和大量的联接,尽管帐户和账单帐户经常以这种方式使用。我刚刚确定这可能是的副本,尽管我想知道这些值是否不是常量值。在
选择
列表中是否只有
c.name
?@ypercube,不一定。这只是一个非常基本的查询,我用它来表达一个简单的案例,我已经讲了很多。通常会有更多的字段和大量的连接,尽管帐户和帐单帐户经常以这种方式使用。