2

これは複雑な質問ですので、シナリオを設定する際はご容赦ください。

次のような単純化されたテーブル設定があるとします。

table 1(employee): {
   employee_id, -primary key
   first_name,
   last_name,
   days_of_employment
}
with data:
employee_id  first_name last_name days_of_employment
111          Jack       Stevens   543
222          Clarice    Bobber    323
333          Roy        Cook      736
444          Fred       Roberts   1000
...

table 2(teams): {
   team_code, --primary key
   description
}
with data:
team_code description
ERA       Enrollment Records Assoc.
RR        Rolling Runners
FR        French Revolution
...

table 3(employees_teams):{
   employee_id, --primary key
   team_code --primary key
}
with data:
employee_id team_code
111         RR
111         FR
222         FR
222         ERA
333         FR
...

これらの表が何であるか、またその目的について明確であることを願っています。要件からの私のシナリオは次のとおりです。「Rolling Runners and Enrollment Records Assoc. チームの従業員の平均雇用日数が必要です。」このクエリの書き方を知っている方法は 2 つありますが、どちらも十分に機能しているように見えますが、本当に知りたいのは、どちらが oracle データベースの処理速度が速いかということです。これらのクエリは、平均計算を台無しにする重複行を生成しないように記述されていることに注意してください。

クエリ 1:

SELECT AVG(e.days_of_employment) avg_days_of_employment
FROM   employee e,
       (
        SELECT DISTINCT employee_id
        FROM   employees_teams
        WHERE  team_code IN ('ERA','RR')) available_employees
WHERE  e.employee_id = available_employees.employee_id

クエリ 2:

SELECT AVG(e.days_of_employment) avg_days_of_employment
FROM   employee e
WHERE  EXISTS(
    SELECT 1
    FROM   employees_teams et
    WHERE  et.team_code IN ('ERA','RR')
      AND  et.employee_id = e.employee_id)

このサンプル データを使用して、この状況が最初から意味をなさない可能性がありますが、どのクエリを使用するのが「より良い」かを知りたいと考えています。

4

1 に答える 1

4

存在を確認する以外にavailable_employeesから何も必要としないので、EXISTSアプローチを使用すると思います。
それはあなたのデータにも依存し、データベースクエリオプティマイザがそれをどのように最適化するかにも依存します。各アプローチのクエリプランを確認し、どちらが安価かを確認することをお勧めします。

これらのリンクも確認してくださいhttp://dotnetvj.blogspot.com/2009/07/why-we-should-use-exists-instead-of.htmlINNERJOIN はEXISTSよりも優れたパフォーマンスを提供できますか

于 2013-02-18T17:41:40.487 に答える