2014-09-10 2 views
0

NETEZZA를 사용하고 있으며 날짜별로 가입하려는 두 개의 별도 테이블이 있습니다. 첫 번째 표에서 날짜는 "날짜"유형 (예 : 2014-09-10)으로 저장되고 두 번째 표에서는 날짜가 "int4"유형으로 저장됩니다 (20140910). 나는 날짜까지 테이블에 합류 해 보았습니다.캐스팅 날짜 (int4)

select * 
from table1 a inner join table2 b 
    on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD') 

이것은 실행되지만 느립니다. 필자가 table1에서 날짜를 int4로 변환하고 int4를 단순히 비교할 수 있다면 비교 속도가 훨씬 빨라질 것을 권장합니다. 그러나, 나는 이것을 할 길을 찾지 못했고, 이것이 최선의 방법이라 할지라도.

+0

변환을 다른 방법으로 수행 할 경우 더 빨리 실행되지 않을 수 있습니다. 다른 유형의 키 조인은 일반적으로 느립니다. –

+0

@ GordonLinoff : 적어도 SQL을 처음 접했을 때 어떻게 캐스트를 수행 할 수 있는지 아이디어를 줄 수 있습니까? 그런 다음 작은 사건으로 직접 시간을 테스트 할 수있었습니다. 제 동료 중 한 명은 저에게 행의 수가 적다는 것을 보여주었습니다. 하이픈을 제거하기 위해 table1의 날짜를 부분 문자열로 지정하면 (즉, int4의 형식과 일치하게됩니다)). 물론 훨씬 더 많은 수의 열에 대해서는 사실 일 것이라고 확신하지 못했습니다. – slaw

+0

변환은 데이터베이스가 인덱스를 사용하는 대신 기본 데이터를 전체적으로 스캔하도록합니다. * 필드 중 하나를 다른 필드와 일치하는 유형으로 변환하십시오. 적어도 하나의 색인을 사용할 수 있습니다. 테이블의 필드를 더 적은 수의 행으로 변환하는 것이 바람직합니다. 실제 유형은 실제로 중요하지 않습니다. –

답변

1

를 작동 할 수있다처럼 쿼리입니다 : 컬럼의 다른 유형에 조인과 함께 일반적으로

select * 
from table1 a inner join 
    table2 b 
    on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD'); 

, 데이터베이스는 정말 힘든 시간을 또는 함수와 조인 할 때. 그 이유는 두 가지입니다 : 기능은 인덱스를 사용하는 것을 어렵게 만듭니다. 다른 유형의 열에 대한 통계는 호환되지 않습니다.

그러나 모든 기능을 한쪽으로 옮기면 엔진에서 어떤 작업을 수행 할 수 있습니다. 예 :

select * 
from table1 a inner join 
    table2 b 
    on b.start_date = cast(to_char(a.start_date, 'YYYYMMDD') as int); 

이렇게하면 모든 변환이 한쪽에서 수행됩니다. b.start_date에 색인이있는 경우 table1을 스캔하고 색인에서 해당 값을 검색 할 수 있습니다. 따라서이 버전은 더 빠르게 실행될 수 있지만 테이블이 동일한 유형을 사용하는 경우에는 그렇지 않습니다.

+0

이런 식으로 생각한 것보다 쿼리의 효율성이 훨씬 빨랐습니다 (몇 분이 아니라 약 10 초가 걸렸습니다!). – slaw

0

시도가는 가지 동일한 날짜 형식이 여기

SELECT * 
FROM table1 a 
INNER JOIN table2 b 
ON (to_date(a.start_date,'YYYY-MM-DD') = to_date (b.start_date, 'YYYY-MM-DD')) 
+0

어쩌면 나는 이해하지 못 하겠지만, 원래의 쿼리와 마찬가지로 날짜를 비교할 때 이것이 어떻게 더 빨리 진행되는지 보지 못합니다. 내가 말할 수있는 것부터, 그것은 내 쿼리만큼 느리게 실행됩니다. – slaw