복붙노트

[SQL] 합니까 오라클은 단락 회로 평가를 사용합니까?

SQL

합니까 오라클은 단락 회로 평가를 사용합니까?

나는 다음과 같이 구성되어있는 오라클 쿼리를 가지고 :

SELECT   *
FROM     table
WHERE    X='true' OR
         Y IN (complicated subquery)

오라클은 X가 여전히 WHERE 절의 Y IN (하위 쿼리) 부분을 평가하기 위해 노력할 것 '사실'과 동일한한다는 것을 본다면? 또한, 이와 같은 성명에서 서브 쿼리는 테이블의 각 항목에 대해 여러 번 실행될 것인가? 내가 좋아하는 뭔가 더 잘 될 것이다 :

WITH subQ as (complicated subquery)
SELECT   *
FROM     table
WHERE    X='true' OR
         Y IN (SELECT id FROM subQ)

해결법

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

    1.때에 따라 다르지. . 일반적으로, 오라클 (PL / SQL은 단락 회로 평가를 수행하도록 보장하지만) SQL 문은 단락 회로 평가를 사용하는 것을하지 보장한다. 오라클 최적화는 가장 효율적인 것으로 예상하고 어떤 순서로 술어를 평가할 무료입니다. 즉, 첫 번째 술어가 먼저 평가되는 것을 의미 할 수 있습니다 만 일치하는 행은 두 번째 술어는 평가가 있지만 어느 역이 발생하는 것이 전적으로 가능 또는 오라클 UNION의 일종으로 쿼리를 변환하는 것이 완전히 결과를 결합하기 전에 두 조건을 평가 .

    때에 따라 다르지. . 일반적으로, 오라클 (PL / SQL은 단락 회로 평가를 수행하도록 보장하지만) SQL 문은 단락 회로 평가를 사용하는 것을하지 보장한다. 오라클 최적화는 가장 효율적인 것으로 예상하고 어떤 순서로 술어를 평가할 무료입니다. 즉, 첫 번째 술어가 먼저 평가되는 것을 의미 할 수 있습니다 만 일치하는 행은 두 번째 술어는 평가가 있지만 어느 역이 발생하는 것이 전적으로 가능 또는 오라클 UNION의 일종으로 쿼리를 변환하는 것이 완전히 결과를 결합하기 전에 두 조건을 평가 .

    옵티마이 술어가 TRUE 또는 FALSE 항상을 평가하는 것으로, 컴파일시에 확인할 수있는 경우에 그 존재는, 최적화 그냥 상수로 그 처리해야했다. 경우에 따라서, 예를 들어, 최적화의 다른 버전 감지하는 서로 다른 능력을 가지고 것이지만 지금까지의 값을 갖는에서 방지 X '가 사실은'옵티마이 (모두에서 두 번째 술어를 평가해서는 안 테이블에 제약이있다 뭔가) 컴파일시 상수입니다.

    질문의 두 번째 부분에 관해서는, 쿼리 계획을 보지 않고, 그것을 이야기하기가 매우 어렵다. 오라클의 최적화를 평가하는 더 효율적인 방법이 있다면 한 가지 형태에서 다른 형태로 쿼리를 변환 꽤 좋은 경향이있다. subQ 테이블에 비해 행의 비교적 많은 수를 반환하는 것입니다 경우 일반적으로, 그러나,이 같이보다는 존재하는 쿼리를 구성하는 것이 더 효율적일 수있다.

  2. ==============================

    2.경고 : 오라클 전문 지식의 내 기본 영역이 아니다.

    경고 : 오라클 전문 지식의 내 기본 영역이 아니다.

    비용 기반 최적화 프로그램은 가능성이 간단한 대안 첫번째 평가 있도록 X의 비용이 = '사실'이 적은 하위 쿼리보다 것을 알아야한다. 그러나 SQL에서 AND와 OR 조건은 같은 단락 &&하고 있지 않습니다 || C 및 그 유도체에있다.

    하위 쿼리는 두 가지 형태 중 하나가 될 수 있습니다 상관 및 비 상관 관계.

    예 하위 쿼리 상관 관계 :

    SELECT *
      FROM Table1
     WHERE X = 'true'
        OR Y IN (SELECT Z FROM Table2 WHERE Table2.A = Table1.B)
    

    예 서브 쿼리 비 상관 관계 :

    SELECT *
      FROM Table1
     WHERE X = 'true'
        OR Y IN (SELECT Z FROM Table2 WHERE Table2.A > 13)
    
  3. ==============================

    3.어떤 이유로 당신이 평가의 특정 명령을 실행해야하는 경우에 관계없이 최적화 또는 AND 및 OR로하지 않을 수도 있습니다 무엇을, 당신은 단락 회로 평가를 보장 다른 도구를 사용하여 쿼리를 다시 작성할 수 있습니다.

    어떤 이유로 당신이 평가의 특정 명령을 실행해야하는 경우에 관계없이 최적화 또는 AND 및 OR로하지 않을 수도 있습니다 무엇을, 당신은 단락 회로 평가를 보장 다른 도구를 사용하여 쿼리를 다시 작성할 수 있습니다.

    예를 들면 :

    select * from table 1
    where case when X = 'true' then 1
               when Y in (select ....)   then 1
          end  = 1
    

    X는 (1) '참'인 경우 다음 식들을 평가하면, 두 번째는 "경우"건너 뛰고 TRUE로 상태 평가한다. X는 '사실'이 아닌 경우 다음 IN 조건이 평가됩니다.

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

    4.나는 단락 회로 평가를 사용하여 충돌하지 않도록하는 방법에 대한 해답을 찾고 여기에왔다. 내가 결국 작업을 가지고하는 것입니다 :

    나는 단락 회로 평가를 사용하여 충돌하지 않도록하는 방법에 대한 해답을 찾고 여기에왔다. 내가 결국 작업을 가지고하는 것입니다 :

    ...
    where case when [its not going to crash] 
               then [short circuit expression] 
               else [safe, never used value] 
           end = comparison_value
    ...
    

    당신이 TO_NUMBER 발현 충돌에 대해 걱정한다면, 예를 들어, 당신은 같은 것을 둘 것 "REGEXP_LIKE (my_possible_number를, '^ [[: 자리 :]] + $')"양의 정수의 경우 절 (에 -에 대한 조정 비 양성 또는 비 정수).

  5. from https://stackoverflow.com/questions/8900631/does-oracle-use-short-circuit-evaluation by cc-by-sa and MIT license