假设我有一个customers
表,其中包含account_number
和billing_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很新。
答案 0 :(得分:1)
OpenEdge使用基于成本的优化程序,因此特定查询计划将受与查询相关的统计信息的影响 - 它可能会也可能不会使用您期望的索引,具体取决于优化程序对数据的了解。 / p>
这篇知识库文章解释了OpenEdge的SQL查询计划:
您还必须定期更新优化程序的SQL统计信息,以便做得很好:
答案 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。