programing

Oracle은 단락 평가를 사용합니까?

testmans 2023. 6. 24. 08:51
반응형

Oracle은 단락 평가를 사용합니까?

다음과 같이 구성된 Oracle 쿼리가 있습니다.

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

Oracle은 X가 'true'와 동일하다고 판단하더라도 WHERE 절의 YIN(하위 쿼리) 부분을 평가하려고 합니까?또한 이와 같은 진술에서 하위 질의는 표의 각 항목에 대해 여러 번 실행됩니까?다음과 같은 것이 더 나을까요?

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

상황에 따라 다릅니다. 일반적으로 Oracle은 SQL 문이 단락 평가를 사용한다고 보장하지 않습니다(PL/SQL은 단락 평가를 수행하도록 보장됨).Oracle Optimizer는 가장 효율적일 것으로 예상되는 순서대로 술어를 자유롭게 평가할 수 있습니다., 첫 만 두 의 즉, 첫, 째, 이로 변환할 수 있습니다.UNION결과를 결합하기 전에 두 술어를 모두 완전히 평가합니다.

즉, 최로 평가할 할 수 , 적화도컴술항평것결수있면다을정할는가하상어가간구시파가에일▁that▁the면,있다▁timeizer수,▁if▁at▁can,▁optimicate▁being즉▁will▁determine▁that▁said결정할▁compile▁to▁a▁evaluate▁pred을것▁always최는적,TRUE또는FALSE최적화 도구는 그것을 상수로 처리해야 합니다.따라서 예를 들어 테이블에 다음과 같은 제약 조건이 있는 경우X최적화 도구는 항상 '참'의 값을 가지므로 두 번째 서술어를 전혀 평가해서는 안 됩니다. (비록 최적화 도구의 버전이 다르면 컴파일 시 어떤 것이 일정하다는 것을 감지할 수 있는 다른 능력이 있을 것입니다.)

질문의 두 번째 부분에 대해서는, 질의 계획을 보지 않고는 말하기가 매우 어렵습니다.Oracle Optimizer는 좀 더 효율적으로 평가할 수 있는 방법이 있을 경우 쿼리를 한 형식에서 다른 형식으로 변환하는 데 매우 능숙합니다.그러나 일반적으로, 만약에.subQ는 에비상대적많행반해은 환 합 니 을 다 로 으 ▁atable를 리를구것더이효수있율습다니로 이 더 일 수 .EXISTSIN.

주의: Oracle은 제 주요 전문 분야가 아닙니다.

의 비용을 알아야 합니다.X = 'true'하위 항목보다 작으므로 더 간단한 대안을 먼저 평가할 수 있습니다.그러나 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)

옵티마이저가 무엇을 할 수 있는지 여부에 관계없이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 조건이 평가됩니다.

저는 단락 평가를 이용하여 충돌을 피하는 방법에 대한 답을 찾고자 왔습니다.결국 제가 일하게 된 것은:

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

따라서 예를 들어 to_number 식의 충돌이 걱정되는 경우 when 절에 "REGEXP_LIKE(my_possible_number, '^[:digit:]+$')"와 같은 것을 넣습니다(양의 정수의 경우 - 양의 정수가 아닌 경우 조정).

언급URL : https://stackoverflow.com/questions/8900631/does-oracle-use-short-circuit-evaluation

반응형