2010-04-03 2 views
0

나는 보통 대신 SQL의 ORM을 사용하고 내가 ... 약간 다른 조인에 터치에서최적화 (내) SQL 쿼리

SELECT `order_invoice`.* 
    , `client`.* 
    , `order_product`.* 
    , SUM(product.cost) as net 
    FROM `order_invoice` 
    LEFT JOIN `client` 
    ON order_invoice.client_id = client.client_id 
    LEFT JOIN `order_product` 
    ON order_invoice.invoice_id = order_product.invoice_id 
    LEFT JOIN `product` 
    ON order_product.product_id = product.product_id 
WHERE (order_invoice.date_created >= '2009-01-01') 
    AND (order_invoice.date_created <= '2009-02-01') 
GROUP BY `order_invoice`.`invoice_id` 

표를 오전/열은이 가게의 ... 논리적 이름입니다 type 응용 프로그램 ... 쿼리가 작동합니다 ... 매우 느립니다 ...

저는 Zend Framework를 사용하고 일반적으로 Zend_Db_Table_Row::find(Parent|Dependent)Row(set)('TableClass')을 사용 하겠지만 많은 조인을해야하며 성능이 향상 될 것이라고 생각했습니다.

내가을 향상시킬 수 있습니다 ... 대신 수백 한 쿼리에서 모든 일을 더 적절한 JOIN 또는 다른 구현을 사용하여 위의 쿼리? 많은 감사합니다.

답변

1

쿼리가 잘못되어 GROUP BY가 잘못되었습니다. 집계 함수에없는 SELECT 부분의 모든 열은 GROUP BY에 있어야합니다. 하나의 열만 언급했습니다.

SQL 모드를 변경하고 ONLY_FULL_GROUP_BY으로 설정하십시오.

이 작업을 완료하고 올바른 쿼리를 사용하면 EXPLAIN을 사용하여 쿼리가 실행되는 방식과 사용되는 인덱스를 확인하십시오. 그런 다음 최적화를 시작하십시오.