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
를 리를구것더이효수있율습다니로 이 더 일 수 .EXISTS
… IN
.
주의: 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
'programing' 카테고리의 다른 글
PHP+MongoDB: 'No sheat file or directory' 메시지와 함께 'MongoCursorException'이(가) 발견되지 않았습니다. (0) | 2023.06.29 |
---|---|
bin과 gac 둘 다 dll, 어떤 것이 사용됩니까? (0) | 2023.06.24 |
Mongoid 파인더가 작동하지 않나요? (0) | 2023.06.24 |
파일 확장명을 기반으로 Gitdiff를 필터링하는 방법은 무엇입니까? (0) | 2023.06.24 |
ASP.NET ID 2에서 "잘못된 토큰" 오류가 발생함 (0) | 2023.06.24 |