0

안녕하세요. 당신은 내가 내 루비 온 레일스 프로젝트의 일환으로이 예제를 사용하고이 SQL을Rails/mysql SUM 별개 레코드 - 최적화

SELECT SUM(tmp.cost) FROM (
    SELECT DISTINCT clients.id as client, countries.credits_cost AS cost 
    FROM countries 
    INNER JOIN clients ON clients.country_id = countries.id 
    INNER JOIN clients_groups ON clients_groups.client_id=clients.id 
    WHERE clients_groups.group_id IN (1,2,3,4,5,6,7,8,9) 
    GROUP BY clients.id 
) AS tmp; 

을 최적화 할 방법. 내 중첩 SQL (tmp)에는 10 밀리언 이상의 레코드가있을 수 있습니다. 성능이 더 좋으면 더 많은 SQL에서이를 분리 할 수 ​​있습니다. 색인을 추가하여 더 빨리 만들 수 있습니까 (ID가 있습니까)?

+0

이 쿼리가 수행해야하는 작업을 설명해 주시겠습니까? 그것은 매우 이상합니다. 왜냐하면 A) DISTINCT clients.id는 그 맥락에서 아무 의미도없는 것 같고, 실제로 clients.id를 선택할 필요가 전혀 없습니다. B) clients.id별로 그룹화하고 있습니다. 첫 번째 국가에서만 비용을 받지만 주문이 없으므로 각 클라이언트에 대해 하나의 임의의 국가를 얻을 수 있습니다. – gtd

+0

내부 SQL에 모든 clients.id 중복을 제거하는 DISTINCT 특성이 있습니다. SQL은 작동하지만 최적화 제안을 찾고 있습니다. – xpepermint

답변

1

당신이 SQL 코드에 관련된 모든 외래 키에 인덱스가 있어야합니다 같은 : clients_groups.client_id, clients.country_id, 그러나 clients_groups.group_id

, 주로 당신은 항목의 번호를 가지고 때 SUM() 또는 COUNT()와 같은 SQL 함수를 사용하면 성능이 저하 될 수 있습니다. 따라서 비용의 캐시를 유지하고 비용에 영향을주는 각 트랜잭션을 업데이트하는 것이 좋습니다.