2012-02-26 7 views
4

내 쿼리를 최적화하려고하는데 내부 조인과 병합이 있습니다.sql, 쿼리 최적화 및 내부 조인?

조인 테이블은 하나의 정수 필드가있는 테이블로, 고유 키가 추가되었습니다.

내 where 절에 대해 세 필드의 키를 만들었습니다.

하지만 계획을 보면 여전히 테이블 스캔을 사용하고 있다고합니다.

어디로 잘못 가고 있습니까?

여기

select date(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype) as due 

from billsndeposits a 

inner join util_nums b on date(a.startdate, '+'||(b.n*a.interval)||' 
    '||a.intervaltype) <= coalesce(a.enddate, date('2013-02-26')) 

where not (intervaltype = 'once' or interval = 0) and factid = 1 

order by due, pid; 
+1

저는 이것이 mysql이라고 가정합니다. –

+0

사용중인 DB의 이름을 입력하십시오. 고려할 수있는 다른 옵션이있을 수 있습니다. –

+0

'date (a.startdate, '+'|| (b.n * a.interval) || ''|| a.intervaltype)'이 방법이 효과가 있습니까? – Isaac

답변

2

나는 당신이 달성하고자하는 것을 이해한다고 생각합니다. 그러나 이런 종류의 조인은 느린 성능을위한 처방입니다. 날짜 계산을 제거하고 병합 (즉, 날짜를 다른 날짜와 비교)하더라도 색인이있는 경우에도 정수 조인과 비교하여 여전히 느립니다. 또한 새로운 날짜를 즉석에서 작성하므로 색인을 생성 할 수 없습니다.

나는 2 열 (1) PID와 임시 테이블을 생성 제안 (또는 당신은 billsndeposits에서 사용하는 어떤 ID) 및 (2)

이 쿼리를 사용하여 새 테이블을 채울 recurrence_dt :

INSERT INTO TEMP 
SELECT PID, date(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype) 
FROM billsndeposits a, util_numbs b; 

을 그런 다음 recurrence_dt 열과 runstats에 대한 색인을 작성하십시오. 이제 select 문은 다음과 같이 할 수 있습니다

SELECT recurrence_dt 
FROM temp t, billsndeposits a 
WHERE t.pid = a.pid 
    AND recurrence_dt <= coalesce(a.enddate, date('2013-02-26')) 

당신이 새로운 테이블에 exp_ts을 추가하고, 이후 임시 데이터를 만료 될 수 있습니다.

원래의 쿼리에 더 많은 작업이 추가된다는 것을 알고 있지만 이것은 성능을 보장 할 수 있으며 자주 실행되는 스크립트에 자연스럽게 들어 맞아야합니다.

감사합니다,

내가 할 것이 또 다른 것은

편집, 그것은 다른 코드에 영향을 미칠 및/또는 수행하지 않는 한, ENDDATE 기본값 = 날짜 ('2013년 2월 26일')하게하다 사업 상 이해하지 못한다. 이런 식으로 당신은 연합으로 일할 필요가 없습니다.

3

대부분의 가능성이 가입 표현이 어떤 인덱스를 사용할 수 없으며 그것이 자연 스캔을 수행하여 계산되며 모든 행에 대해 date(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype)을 계산 내 쿼리입니다.

BTW : 정말 이상한 조인 조건입니다. billsndepositsutil_nums에 가입시키는 더 좋은 방법을 찾으십시오 (실제로 필요한 경우).

+0

글쎄, 나는 일, 월 등을 intervaltype 필드에 저장하고 간격으로 생성 된 숫자를 추가하고 사용자 정의 날짜 반복을 생성하는 것을 평가합니다. util_nums는 순전히 미래에 재발을 제공합니다. 예 :'+ 7 months' – Jules

+0

@Jules 나는 당신이 달성하고자하는 것과 두 테이블의 구조와 내용이 내 머리를 감쌀 수 없다. 어쩌면 테이블 구조와 예제 컨텐츠를 포함하여 질문을 업데이트 할 수있다. 달성하고자하는 것에 대한 설명 –