2016-12-12 4 views
4

오래 전에 데이터베이스에서 멀리 떨어진 개발자가 서술문이 작성된 순서에 의존하는 쿼리를 작성했습니다. 예를 들어오라클 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; 
+0

당신은 b 테이블에 수백만 개의 행이있을 수 있다고 말합니다 ('단점은 to_char can op 백만 줄을 말로 표현하자.); 암시 적 변환으로 인해 to_number 함수가 적용될 것이므로 테이블에 몇 행이 있습니까? 테이블에 비슷한 (또는 그 이상) 행이 있다면 to_char 때문에 성능에 부정적인 영향을주지 않을 것입니다. – Boneist

+1

또는 숫자 값만 포함하는 테이블 a에 가상 열을 만든 다음 해당 열을 인덱싱 할 수 있습니다. 그러면 쿼리를 a.new_numeric_virtual_column = b.numeric_column의 내부 조인 b에서 x를 선택하도록 단순화 할 수 있습니다. ' – Boneist

+0

이제 아이디어가 나옵니다! 나는 가상 컬럼을 고려하지 않았다는 것을 인정해야한다! 제안 해 주셔서 감사합니다! – 0909EM

답변

1

- 당신은 (https://docs.oracle.com/database/121/SQLRF/queries008.htm#SQLRF52358)

select x 
    from b 
    inner join (
       select only_rows_with_numeric_values as numeric_column, 
       rownum 
       from a 
       where NOT REGEXP_LIKE (a.column, '[^[:digit:]]') 
      ) c 
    on c.numeric_column = b.numeric_column; 

이 억제 문서 쿼리 unnesting하거나 힌트 /*+ no_unnest*/를 사용에 따라 rownum를 사용하여 옆에 마지막 쿼리를 다시 작성해야 https://jonathanlewis.wordpress.com/2015/06/02/predicate-order-2/

보고

+0

Jonathan Lewis에게 연결해 주셔서 감사합니다! 내 인터넷 검색에서 언급 된 rownum 볼 수 있지만 오라클 워드 프로세서, 링크 덕분에 그것을 볼 수 없습니다. – 0909EM

관련 문제