2009-11-22 4 views
0

나는 테이블 ~ 20,000,000 항목이날짜에 가장 가까운 데이터를 찾고 계십니까?

CREATE TABLE `symbol_details` (
    `symbol_header_id` int(11) DEFAULT NULL, 
    `DATE` datetime DEFAULT NULL, 
    `ADJ_NAV` double DEFAULT NULL 
) 

있습니다. 지금은 하나의 symbol_header_id을 위해 가장 가까운 분기 말에 ADJ_NAV 값을 찾으려면 : 나는 내부 "날짜 선택"을 실행하면

SET @quarterend = '2009-3-31'; 

SELECT symbol_header_id AS she, ADJ_NAV AS aend FROM symbol_details 
WHERE 
symbol_header_id = 18546 
AND DATE= (
# date closest after quarter end 
SELECT DATE FROM symbol_details 
WHERE ABS(DATEDIFF(DATE, @quarterend)) < 10 
AND DATE<[email protected] 
AND symbol_header_id = 18546 
ORDER BY ABS(DATEDIFF(DATE, @quarterend)) ASC LIMIT 1) 

신속 반환 쿼리합니다. 하위 쿼리 대신 올바른 날짜로 채워진 외부 쿼리를 실행하면 매우 빨리 완료됩니다. 그러나 내가 영원히하는 모든 일을 실행할 때 - 뭔가 잘못 됐습니까?

+0

당신이 날뿐만 아니라 symbol_header_id에 인덱스를 가지고 있습니까? – Donnie

+0

나는 그렇다. 날짜 및 기호 _ 머리글 _id 및 날짜 _ 기호 _ 머리글 _id에 하나. 쿼리가 평가되는 방식이 변경 되었습니까? –

답변

1

아마도 하위 쿼리없이 할 수 있습니다. 그냥 첫 번째 행을 잡아 :

SELECT * 
FROM symbol_details 
WHERE DATE <= @quarterend 
AND symbol_header_id = 18546 
ORDER BY DATE DESC 
LIMIT 1 
+0

그렇습니다. 그러나 문제는 해당 분기의 데이터가 없으면 실제로 오래된 데이터를 반환한다는 것입니다. 하지만 그냥 추가 할 수 있습니다. 및 날짜> @quarterstart ... 시도해 보겠습니다. 답장을 보내 주셔서 감사합니다. –

+0

이것은 위대하며 해결책을 찾았습니다. 계속 진행되는 원래 게시물에서 내 호언 장담을 보았습니다. 그러나 이것을 모든 값을 얻기 위해 그룹으로 변경해야했습니다. 하지만 이제는 또 다른 문제가 있습니다 ... –

+0

@ Martin Stein :'GROUP BY symbol_header_id DESC'가하는 일에 대해서는 확신하지 못합니다. 그래서 나는 새로운 질문에서 그것을 묻습니다. – Andomar

2

최적화 프로그램은 성명을 적절하게 평가하고 가장 효율적인 계획을 찾는 데 몇 가지 문제가있는 것으로 보입니다. (오라클에서 통계를 업데이트 해달라고 부탁했지만, MySQL에서 옵티마이 저가 작동하는 방법을 잘 모르겠습니다.)

필자의 진술을 가장 잘 이해할 수있는 다른 방법을 시도해 보았습니다. 최적화 : 명시 적으로

  • 는 자기가 symbol_details을 조인 할 '1 제한으로 주문 대신의
  • 시도 SELECT max(date) ..을 시도 임멜 및 외부 쿼리의 두 symbol_header_ids를 연결

여기에 유용한 아이디어가 있기를 바랍니다.

1

시도 :

SELECT t.symbol_header_id, 
      COALESCE(t.adj_nav, '0.0') 'adj_nav' 
    FROM SYMBOL_DETAILS t 
LEFT JOIN (SELECT sh.symbol_header_id, 
        MAX(sh.date) 'max_date' 
      FROM SYMBOL_DETAILS sh 
      WHERE ABS(DATEDIFF(sh.date, @quarter_end)) < 10 
       AND sh.date <= @quarter_end) x ON x.symbol_header_id = t.symbol_header_id 
              AND x.max_date = t.date 
    WHERE t.symbol_header_id = 18546 
관련 문제