2014-12-18 4 views
1

내 테이블은 다음과 같이이다 : 나는 오류 및 지연이 있었다 얼마나 많은 고유의 사용자와 그들 중 얼마나 많은보고 싶어요 각 entry_point 당 : 내가 달성하고자하는 것은 다음과 같은 요약입니다중첩 쿼리없이 MySQL에서 그룹 집계를 수행하는 방법은 무엇입니까?

CREATE TABLE USER_TRANSACTIONS (
    START_TIME  BIGINT UNSIGNED NOT NULL, 
    APPLICATION_ID CHAR(64) BINARY NOT NULL, 
    ENTRY_POINT  CHAR(255) BINARY NOT NULL, 
    USER_ID   CHAR(64) BINARY NOT NULL, 
    ERROR_VIOLATION BIT(1) NOT NULL, 
    LATENCY_VIOLATION BIT(1) NOT NULL, 
    PRIMARY KEY (START_TIME, APPLICATION_ID, ENTRY_POINT, USER_ID) 
) 

문제. 나는이 쿼리와 함께이 목표를 달성 할 수

ENTRY_POINT | TOTAL_USERS | TOTAL_ERRORS | TOTAL_LATENCY 
page1  | 2   | 2   | 1 
page2  | 1   | 1   | 1 

: 예를 들어

SELECT UT.ENTRY_POINT, COUNT(USER_ID) AS TOTAL_USERS, SUM(EXP_ERRORS) AS TOTAL_ERRORS, SUM(EXP_LATENCY) AS TOTAL_LATENCY 
FROM (
    SELECT ENTRY_POINT, USER_ID, 
    BIT_OR(ERROR_VIOLATION) AS EXP_ERRORS, 
    BIT_OR(LATENCY_VIOLATION) AS EXP_LATENCY 
    FROM user_transactions 
    GROUP BY ENTRY_POINT, USER_ID 
) AS UT 
GROUP BY UT.ENTRY_POINT; 
중첩 된 쿼리는 사용자가 오류 또는 지연 문제를 경험 한 경우 요약 사용

하지만, 테이블에 데이터가 많아서 성능 문제가 있습니다.

제 질문은 내부 쿼리의 사용을 피하기 위해이 쿼리를 어떻게 최적화 할 수 있습니까?

SELECT 
    ENTRY_POINT 
     ,COUNT(USER_ID) AS TOTAL_USERS 
     ,SUM(EXP_ERRORS) AS TOTAL_ERRORS 
     ,SUM(EXP_LATENCY) AS TOTAL_LATENCY 
    FROM user_transactions 
    GROUP BY ENTRY_POINT 
+0

조회에 보이는 거의 나에게 최적의 같은 :

SELECT ENTRY_POINT, COUNT(DISTINCT USER_ID), SUM(ERROR_VIOLATION > 0) AS TOTAL_ERRORS, SUM(LATENCY_VIOLATION > 0) AS TOTAL_LATENCY FROM user_transactions GROUP BY ENTRY_POINT; 

당신이 사용자 대신 전체 오류의 오류가있는하려면 다음은 쿼리를 작성하는 방법 중 하나입니다. 모든 행을 처리해야하기 때문에 많은 데이터가 비싸게됩니다. 기본 데이터가 너무 많이 변경되지 않으면 구체화 된보기로 작업 할 수 있습니다. –

답변

2

사용 count(distinct) :

+0

첫 번째가 아니라 두 번째. 그러나 이것은 더 빠를 것입니까? –

+0

두 번째 것입니다. 그것은 동등하고 약 20 % 더 빠릅니다. 고든 고마워. 첫 번째 쿼리가 잘못되어 무시해야합니다. – odavid

1

당신은 단지 같은 것을 사용할 수 없습니다.

SELECT ENTRY_POINT, COUNT(DISTINCT USER_ID), 
     COUNT(DISTINCT CASE WHEN ERROR_VIOLATION > 0 THEN USER_ID END) AS TOTAL_ERRORS, 
     COUNT(DISTINCT CASE WHEN LATENCY_VIOLATION > 0 THEN USER_ID END) AS TOTAL_LATENCY 
FROM user_transactions 
GROUP BY ENTRY_POINT; 
+1

이것은 결코 동등하지 않습니다. –

+0

Erwin이 옳습니다. 그것은 각 사용자 당 오류를 합산하지 않습니다. – odavid

관련 문제