오래 전에 데이터베이스에서 멀리 떨어진 개발자가 서술문이 작성된 순서에 의존하는 쿼리를 작성했습니다. 예를 들어오라클 12c 인라인 뷰 평가
,
select x
from a, b
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
and a.char_column = b.numeric_column;
(계획이
to_number
변환
a.char_column
에 적용 할 제안 설명)
나는이 "단지 작동"(오라클 11g)를 설계하는 것보다 더 많은 기회로 생각한다. 그러나 Oracle 12c에서 실행될 때 술어의 순서가 준수되지 않으므로이 쿼리는 유효하지 않은 숫자 예외로 중단됩니다. 나는
select /*+ ORDERED_PREDICATES +*/ x
from a, b
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
and a.char_column = b.numeric_column
을 다음과 같이 내가 ORDERED_PREDICATES
힌트를 사용하여 순서대로 조건을 평가하기 위해 12C를 강제로 시도 할 수 있다는 것을 알고 있어요 .. 또는 비교를 위해 to_char
를 사용하여 값 중 하나를 캐스팅. 단점은 to_char
이 백만 개의 행을 처리 할 수 있다는 것입니다. 다음 인라인보기는 아마도 더 나은 솔루션이라고 생각합니다. 인라인 뷰를 먼저 평가할 것이라고 확신합니까? 술어 순서 정보
select x
from b
inner join (
select only_rows_with_numeric_values as numeric_column
from a
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
) c
on c.numeric_column = b.numeric_column;
당신은 b 테이블에 수백만 개의 행이있을 수 있다고 말합니다 ('단점은 to_char can op 백만 줄을 말로 표현하자.); 암시 적 변환으로 인해 to_number 함수가 적용될 것이므로 테이블에 몇 행이 있습니까? 테이블에 비슷한 (또는 그 이상) 행이 있다면 to_char 때문에 성능에 부정적인 영향을주지 않을 것입니다. – Boneist
또는 숫자 값만 포함하는 테이블 a에 가상 열을 만든 다음 해당 열을 인덱싱 할 수 있습니다. 그러면 쿼리를 a.new_numeric_virtual_column = b.numeric_column의 내부 조인 b에서 x를 선택하도록 단순화 할 수 있습니다. ' – Boneist
이제 아이디어가 나옵니다! 나는 가상 컬럼을 고려하지 않았다는 것을 인정해야한다! 제안 해 주셔서 감사합니다! – 0909EM