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,不一定。这只是一个非常基本的查询,我用它来表达一个简单的案例,我已经讲了很多。通常会有更多的字段和大量的连接,尽管帐户和帐单帐户经常以这种方式使用。