1

假设我有一个customers包含 anaccount_number和 a的表billing_account_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_terms.account已被索引,那么该索引会在两种情况下都使用吗?两个陈述是否相同?是否有任何与其中一项相关的费用?

尽管我对中等级别的 SQL 相当陌生,但我为自己的天真道歉。

4

2 回答 2

1

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

这篇知识库文章解释了 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

于 2012-10-01T12:34:01.400 回答
0

我对opengge一无所知,但我认为任何一个都不会使用索引。其中2个基本相同。

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

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

再说一次,这在某种程度上是推测,正如我再说一遍,我对opengge一无所知。

于 2012-09-17T14:52:31.093 回答