복붙노트

[SQL] SQL에서 조건을 실행하기 위해 '어디에'조항

SQL

SQL에서 조건을 실행하기 위해 '어디에'조항

내가 좋아하는 내 where 절에 조건의 집합이

WHERE 
d.attribute3 = 'abcd*'  
AND x.STATUS != 'P' 
AND x.STATUS != 'J' 
AND x.STATUS != 'X' 
AND x.STATUS != 'S' 
AND x.STATUS != 'D' 
AND CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP

이러한 조건 중 어느 것이 먼저 실행됩니다? 나는 오라클을 사용하고 있습니다.

내 실행 계획에서 이러한 정보를 얻을 수 있습니까? (나는 다른 내가 시도 것, 여기에 DB에 그렇게 할 수있는 권한이 없습니다)

해결법

  1. ==============================

    1.당신은 확실히 당신은 실행 계획을 볼 수있는 "권한이없는"있습니까? AUTOTRACE를 사용하는 방법에 대한 무엇?

    당신은 확실히 당신은 실행 계획을 볼 수있는 "권한이없는"있습니까? 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")
    

    당신이 볼 수 있듯이, 그 쿼리를 실행하는 방법에 대해 자세히 꽤 많이 있습니다. 그것은 저에게 말한다 :

    응용 프로그램이 순서는 우리가이 재 주문 쿼리를 보여줄 수있는 술어는 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")
    
  2. ==============================

    2.데이터베이스가있는 조건을 실행하기 위해 어떤 순서로 결정합니다.

    데이터베이스가있는 조건을 실행하기 위해 어떤 순서로 결정합니다.

    가능한 보통 (항상은 아니지만) 먼저 인덱스를 사용합니다.

  3. ==============================

    3.로하고있다 당신에게 정보를 줄 것이다 실행 계획을보고했다. 당신이 계획의 안정성 기능을 사용하지 않는 그러나, 당신은 항상 동일하게 남아있는 실행 계획에 의존 할 수 없다.

    로하고있다 당신에게 정보를 줄 것이다 실행 계획을보고했다. 당신이 계획의 안정성 기능을 사용하지 않는 그러나, 당신은 항상 동일하게 남아있는 실행 계획에 의존 할 수 없다.

    당신이 게시 된 쿼리의 경우, 나는 약 효율은 당신이 생각하는 것 같다, 그래서 어떤 방법으로 로직을 변경됩니다 평가 순서처럼 보이지 않는다. 그것은 매우 가능성이 오라클 최적화 효율적인 계획을 선택하는 것입니다.

    당신은 기본 쿼리 성능을 비교하려는 경우 특정 순서를 장려하기 위해 할 수있는 트릭이있다. 먼저 실행되는 타임 스탬프 조건을 원했다는 것을 예를 들어 보겠습니다. 이 작업을 수행 할 수 있습니다 :

    WITH subset AS
      ( SELECT /*+ materialize */
          FROM my_table
          WHERE CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP
      )
    SELECT *
      FROM subset
      WHERE 
      d.attribute3 = 'abcd*'  
      AND x.STATUS != 'P' 
      AND x.STATUS != 'J' 
      AND x.STATUS != 'X' 
      AND x.STATUS != 'S' 
      AND x.STATUS != 'D'
    

    은 "구체화"힌트는, 제 인라인 쿼리를 실행 다른 조건이 결과 세트를 검색하기 위해 최적화를 야기한다.

    난 당신이 일반적인 습관으로 이렇게 조언하고 있지 않다. 대부분의 경우 단지 최적의 실행 계획으로 이어질 것입니다 간단한 쿼리를 작성.

  4. ==============================

    4.는 CPU 기반 비용 모델 9i의 도입 및 10g + 오라클에서 기본적으로 사용에서, 실행 계획에 다른 의견을 추가하려면 또한 술어 평가 순서가이 영향을 미치지 않는 경우에도 낮은 계산 비용 발생합니다있는 평가를 할 것입니다 테이블 액세스 순서 및 방법에 관한 것이다. 적은 조건 계산 결과의 다른 전에 술어를 실행함으로써 실행되는 경우 다음 optimisaton 적용 할 수있다.

    는 CPU 기반 비용 모델 9i의 도입 및 10g + 오라클에서 기본적으로 사용에서, 실행 계획에 다른 의견을 추가하려면 또한 술어 평가 순서가이 영향을 미치지 않는 경우에도 낮은 계산 비용 발생합니다있는 평가를 할 것입니다 테이블 액세스 순서 및 방법에 관한 것이다. 적은 조건 계산 결과의 다른 전에 술어를 실행함으로써 실행되는 경우 다음 optimisaton 적용 할 수있다.

    자세한 내용은이 문서를 참조하십시오 http://www.oracle.com/technology/pub/articles/lewis_cbo.html

    점검 제한 조건 또는 파티션 정의와 비교 행이 어쨌든 반환 될 수 있음을 나타냅니다 경우 또한, 오라클은 심지어 술어를 실행할 필요가 없습니다.

    복잡한 물건.

  5. ==============================

    5.마지막으로, 관계형 데이터베이스 이론은 당신이 그렇게 최선의 노력하지 않는 쿼리 조항의 실행 순서에 의존하지 않을 수 있다고 말한다. 다른 사람이 말했듯이, 비용 기반이 생각하는 것을 선택하려고 최적화가 가장 좋지만에도 사용되는 실제 순서를 보장하지 않습니다 계획을 설명하는보기. 계획을 설명하는 것은 단지 CBO 권장 무엇인지를 알 수 있지만, 아직 100 % 아니다.

    마지막으로, 관계형 데이터베이스 이론은 당신이 그렇게 최선의 노력하지 않는 쿼리 조항의 실행 순서에 의존하지 않을 수 있다고 말한다. 다른 사람이 말했듯이, 비용 기반이 생각하는 것을 선택하려고 최적화가 가장 좋지만에도 사용되는 실제 순서를 보장하지 않습니다 계획을 설명하는보기. 계획을 설명하는 것은 단지 CBO 권장 무엇인지를 알 수 있지만, 아직 100 % 아니다.

    당신이이 일을하려는 이유를 설명 어쩌면 경우, 일부는 계획을 제안 할 수 있을까?

  6. ==============================

    6.까다로운 질문입니다. 그냥 같은 딜레마에 직면했다. 나는 쿼리 내에서 기능을 언급 할 필요가있다. 당신이 일반적으로 성능에 영향을 미치는 방법을 이해 있도록 기능 자체는 다른 쿼리를합니다. 조건의 나머지 부분이 먼저 실행한다면 우리가 가지고있는 대부분의 경우, 함수가 너무 자주 호출 할 수 없습니다 것입니다.

    까다로운 질문입니다. 그냥 같은 딜레마에 직면했다. 나는 쿼리 내에서 기능을 언급 할 필요가있다. 당신이 일반적으로 성능에 영향을 미치는 방법을 이해 있도록 기능 자체는 다른 쿼리를합니다. 조건의 나머지 부분이 먼저 실행한다면 우리가 가지고있는 대부분의 경우, 함수가 너무 자주 호출 할 수 없습니다 것입니다.

    음, 여기에 주제에 대한 다른 기사를 게시하는 것이 유용 할 것이라고 생각했다.

    다음의 인용문은 도널드 Burleson의 사이트 (http://www.dba-oracle.com/t_where_clause.htm)에서 복사됩니다.

  7. from https://stackoverflow.com/questions/340139/execution-order-of-conditions-in-sql-where-clause by cc-by-sa and MIT license