sql >> データベース >  >> RDS >> Oracle

SQLの条件の実行順序'where'句

    あなたは確かに あなたは実行計画を見る「権限を持っていない」のですか? AUTOTRACEの使用はどうですか?

    SQL> set autotrace on
    SQL> select * from emp
      2  join dept on dept.deptno = emp.deptno
      3  where emp.ename like 'K%'
      4  and dept.loc like 'l%'
      5  /
    
    no rows selected
    
    
    Execution Plan
    ----------------------------------------------------------
    
    ----------------------------------------------------------------------------------
    | Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
    |   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
    |*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
    |*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
    |*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
       3 - filter("DEPT"."LOC" LIKE 'l%')
       4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    

    ご覧のとおり、これにより、クエリの実行方法について非常に多くの詳細がわかります。それは私にそれを教えてくれます:

    • EMPのフルスキャンでは、条件「emp.ename like'K%'」が最初に適用されます
    • 次に、一致するDEPTレコードがdept.deptnoのインデックスを介して(NESTED LOOPSメソッドを介して)選択されます
    • 最後に、「l%」のようなフィルター「dept.loc」が適用されます。

    このアプリケーションの順序は、この並べ替えられたクエリで示すことができるように、WHERE句での述語の順序とは関係ありません。

    SQL> select * from emp
      2  join dept on dept.deptno = emp.deptno
      3  where dept.loc like 'l%'
      4  and emp.ename like 'K%';
    
    no rows selected
    
    
    Execution Plan
    ----------------------------------------------------------
    
    ----------------------------------------------------------------------------------
    | Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
    |   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
    |*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
    |*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
    |*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
       3 - filter("DEPT"."LOC" LIKE 'l%')
       4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    


    1. SQLServerのテーブルで使用されているスペースを確認してください

    2. FORMAT()は素晴らしいですが、…

    3. LinuxからのSQLServerBULK INSERT

    4. T-SQLで文字列の一部を置き換える方法