3

このような投稿をしても大丈夫だと思います。

私はかなり長い間SQLを使用しており、職場の人々はデータベース内の同じ数または行を返すために2つの異なる方法を使用しています。

例えば:

SELECT Name
FROM
    Employees
WHERE
    DepartmentID IN (SELECT DepartmentID
                         FROM
                             Departments
                         WHERE
                             Department LIKE '%Engineering')

SELECT Employees.Name
FROM
    Departments
    INNER JOIN Employees
        ON Departments.DepartmentID = Employees.DepartmentID
WHERE
    Departments.Department LIKE '%Engineering'

どちらも同じデータを返します。人々は、サブクエリを使用することがそれを行うための最良の方法であると私に言ってきました。

私の質問はこれです:これらの2つのうちどちらがより速く実行されますか?私の推測では、内部結合があると思いますが、間違っている可能性があります。

ありがとう。

4

3 に答える 3

5

この場合、両方とも同等です。ただし、INNER JOINの場合、同じDepartmentIDで複数の部門が選択されていると、そのDepartmentIDの従業員が複数回返されます。

SQLは宣言型言語です。つまり、この言語はクエリの実行方法を示すものではなく、どのような結果を見つける必要があるかだけを示します。それを実行する方法を理解するのはDMBS次第です。

まともなSQLデータベースは、おそらく両方が同じまたは同様のことを行うようにそれらを最適化します。

彼らが同じことをしているのかどうかを確認するにはEXPLAIN、クエリを実行します。

それらが同じステップを持っている場合、明らかにそれらは実行するのに同じ時間かかります。それ以外の場合は、データベースがどのように異なる方法で処理されているかがわかります。DBMSがどのように最適化するかは、実装によって異なります。したがって、最良の方法はを使用することEXPLAINです。

注:EXPLAINは、SELECTなどと同様にSQLコマンドです。http ://www.sql.org/sql-database/postgresql/manual/sql-explain.htmlを参照してください。

それが同じステップで実行されると仮定すると、それを書く方法は、意図が何であるかが最も明確に見えると思う方法になります。

于 2012-08-21T21:06:02.903 に答える
4

これらの2つのクエリ同等ではありません。「IN」クエリに相当するものは次のとおりです。

SELECT Name
FROM Employees e join
     (SELECT distinct DepartmentID
      FROM Departments
      WHERE Department LIKE '%Engineering'
     ) d
     on e.DepartmentID = d.DepartmentId

つまり、「IN」バージョンは重複する行を返すことはできません。結合バージョンは重複した行を返す可能性があります。この場合、departmentidはおそらくテーブル内で一意であるため、そうなるとは思いません。

次の質問は最適化についてです。SQLエンジンは、実際には2つのバージョンを同等に最適化する必要があります。つまり、「IN」バージョンの方が読みやすいということです。

ただし、これには1つの大きな例外があります。INに関しては、MySQLは間違いなく最適ではありません。そのデータベースエンジンを使用する場合は、結合バージョンを使用することをお勧めします。

ちなみに、これを行うには、次のような他の方法があります。

select name
from employees e
where exists (select 1 from Departments d
              where e.Departmentid = d.DepartmentId and
                    d.Department LIKE '%Engineering'
             )

どちらが最適です。。。使用しているデータベースを測定する必要があります。

于 2012-08-21T21:13:18.487 に答える
0

最新のRDBMSのクエリオプティマイザは、おそらく内部的に同じように機能するため、パフォーマンスに違いはありません。

古いRDBMSはおそらく違いを示すかもしれませんが、これはRDBMS自体に依存します。

于 2012-08-21T21:07:43.793 に答える