2011-04-07 5 views
0

다음과 같은 두 가지 쿼리가 있는데 더 효율적으로 할 수있는 것이 무엇인지 궁금합니다. a) 하위 쿼리와 내부 조인을 사용하거나 b) CONVERT_TZ()를 여러 번 호출하는 방법?하위 쿼리와 실행중인 함수의 효율성이 여러 번입니까?

아니면 더 효율적인 방법이 있습니다. 어떤 아이디어라도 감사 할 것입니다!

쿼리가 수행하는 작업은 이미 저장된 오프셋 값을 사용하여 DATETIME을 다른 시간대 (EDT : GMT-4)로 변환하는 것입니다. 프로덕션 환경에서이 쿼리를 실행할 때 수천 개의 레코드가 있습니다.

USE weblist; 

SELECT metropolitan_area 
    ,date_time 
    ,gmt_offset 
    ,gmt_offset + 4 AS hours 
    ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS EDT 
    ,DAYOFMONTH(date_time) AS day 
    ,MONTH(date_time) AS month 
    ,DATE_FORMAT(date_time, '%h:%i %p') AS date_time_ 
    ,DAYOFMONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS dayEDT 
    ,MONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS monthEDT 
    ,DATE_FORMAT(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') 
    ,'%h:%i %p') AS date_timeEDT 
    FROM weblist 
    ORDER BY gmt_offset DESC; 

SELECT cl.metropolitan_area 
    ,cl.date_time 
    ,edt.date_timeEDT 
    ,DAYOFMONTH(cl.date_time) dayOrg 
    ,MONTH(cl.date_time) AS monthOrg 
    ,TIME_FORMAT(cl.date_time, '%h:%i %p') AS dateTimeOrg 
    ,DAYOFMONTH(edt.date_timeEDT) dayEDT 
    ,MONTH(edt.date_timeEDT) AS monthEDT 
    ,TIME_FORMAT(edt.date_timeEDT, '%h:%i %p') AS dateTimeEDT 
    FROM (
    SELECT 
     id 
     ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS date_timeEDT 
    FROM weblist 
    ) edt 
    INNER JOIN weblist AS cl ON cl.id = edt.id 
    ORDER BY cl.gmt_offset DESC; 
+0

'WITH'는 mysql이 지원하지 않는다는 점을 제외하고는 여기에서 매우 좋을 것입니다 ... – dancek

답변

0

여러 CONVERT에 대해 투표하고 싶습니다. 나는 mysql이 똑같은 것을 알기에 충분히 똑똑하다는 것을 읽었을 것이라고 생각한다. 그래서 그것은 매 행마다 한 번만 수학을 수행 할 것이다.

또한 WHERE 절을 추가 할 때 어떤 일이 일어나는지 생각해보십시오. 항상 weblist의 내부 및 외부 SELECT 문에 추가해야한다는 것을 기억합니까?

+0

좋은 사람들 같아요. 당신의 도움을 주셔서 감사합니다! – Eric

2

어떤 것이 더 효율적인지 궁금한 경우 효율성을 측정하고 측정하는 데 사용할 메트릭을 결정하십시오. 다른 것은 단지 추측 일뿐입니다.

+1

+1 임의의 시간을 테스트 테이블에 삽입 한 코드를 작성한 다음 선택하여 시간이 빠른 것을 확인하십시오. – Johan

관련 문제