2013-07-18 2 views
0

oracle SQL을 사용하여 작업하십시오. 두 개의 테이블이 있습니다. 첫 번째는 숫자 범위를 포함하고 두 번째 숫자는 숫자를 포함합니다. 내가 필요한 결과는 첫 번째 테이블과 첫 번째 테이블 번호 범위에없는 두 번째 테이블의 번호입니다. 나는이 솔루션을 가지고SQL 쿼리 성능이 느립니다. 숫자 범위와 숫자

table ranges 
LOW_RANGE   HIGH_RANGE 
1000000000000000000 1000000099999999999 
4253525250000000000 4253525259999999999 
4352000000000000000 4352999999999999999 

table numbers 
NUMBER  LENGTH (implies that the rest of the numbers are 0-9 range) 
100000000000 12(max) 
100000000051 12 
425252525100 10 
435252525000 9 
425353000000 6 
797689600000 9 

needed result: 
LOW_RANGE  HIGH_RANGE 
100000000000 100000009999 (ranges) 
425252525000 425252525999 (ranges) 
435200000000 435299999999 (ranges) 
425353000000 425353999999 
797689600000 797689600999 

:

작동하지만 큰 데이터 세트에 대한 매우 느립니다
SELECT 
    SUBSTR(ranges.LOW_RANGE,1,9)||'000' 
    ,SUBSTR(ranges.HIGH_RANGE,1,9)||'999' 
FROM 
    ranges 
UNION ALL 
SELECT 
    numbers.NUMBER 
    ,RPAD(SUBSTR(numbers.NUMBER,1,numbers.NUMBERLENGTH),12,'9') 
FROM 
    numbers b 
WHERE b.NUMBER NOT IN 
(
    SELECT b.NUMBER 
    FROM ranges a 
    WHERE b.NUMBER BETWEEN SUBSTR(a.LOW_RANGE,1,9)||'000' AND SUBSTR(a.HIGH_RANGE,1,9)||'999' 
) 

. 다른 빠른 솔루션이 있습니까?

수정 : 수정 된 질문

+0

성능에 대해 우려되는 경우 문자열 작업과 함께 수행중인 실제 작업을 표시하십시오. 이것은 성능에 큰 차이를 만듭니다. –

+0

흠, 네 말이 맞아. 문자열 연산을위한 수정 된 질문. 이러한 문자열 연산과 기타 중요하지 않은 필드에 대한 몇 가지 디코드가 유일한 연산입니다. – llll

답변

0

문자열 조작은 일반적으로 데이터베이스가 느립니다.

제 개인적인 권장 사항은 테이블의 구조를 변경하고 모든 것을 숫자로 수정하는 것입니다.

table numbers 
RANGE_START RANGE_END 
100   999 

그런 다음 번호를 사용하도록 쿼리를 재 작성 번호 테이블

table ranges 
LOW_RANGE_START LOW_RANGE_END HIGH_RANGE_START HIGH_RANGE_END 
100    000   101    999 

과 같은 일이 훨씬 빨라집니다. 특히 데이터를 올바르게 색인화하는 경우

+0

불행하게도 테이블 구조를 수정하는 것은 쉬운 일이 아닙니다. 그래서 최후의 수단 만. – llll

+0

SUBSTR, RPAD는 결정적인 함수이므로 필드에 함수 기반 인덱스를 만들면 쿼리 속도가 빨라집니다. –

+0

범위 쿼리 및 인덱싱에 대한 자세한 내용은 http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/greaterless-between-tuning-sql-access-filter-predicates를 참조하십시오. 기능 기반 인덱스 : http://www.oracle-base.com/articles/8i/function-based-indexes.php –

관련 문제