1

と を持つcustomersテーブルがあるaccount_numberbilling_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

openge についての知識はありませんが、どちらもインデックスを使用することはないと思います。そのうちの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

繰り返しますが、これはどういうわけか憶測です。もう一度言いますが、openge についての知識はありません。

于 2012-09-17T14:52:31.093 に答える