2014-09-01 1 views
2

다음과 같은 문제점이 있습니다 (실제 상황을 알려 드리겠습니다) :
일련의 ID가 있습니다 (이러한 ID와 관련된 데이터는 물론 있지만 핵심 문제가 있습니다) 1. 위로 500000
이제 이들 시퀀스는 이지만은 임의로 "도착"하고 일부는 결코 도착하지 않을 수 있으며 다른 사람들은 여러 배치에 자주 올 수있어 불균등하게 분산됩니다 (내가 말할 때 언급하는 것은 데이터 베이스).
ID 및 모양이 일종의 카운트를 만드는 경우 양수가 올바르게 처리되도록 버킷의 적절한 수를 몇 개나 찾을 수 있습니까? 내 문제의분산이 같지 않을 경우 해시의 버킷 수를 어떻게 계산할 수 있습니까?

상황 :
내가 읽고 있던 약 hash partitioning
나는 기본적인 가정은 당신이 해시 열 값이 잘 분포되어 있다고 생각합니다. 그러나 테이블에서 잘 분산 된 열/속성에 분할 할 수없는 경우 (예 : 데이터가 잘 분산되어 있지 않음, 예 : 매우 적은 수의 제품을 구매하는 다른 제품보다 많은 것을 구매하는 고객 ID)
이렇게 처리해야합니까? 대신 파티션 범위가 작아야합니까?

SET @partitions = 4; 

SELECT 
    id_column % @partitions as bucket, 
    MONTH(your_date) as month, 
    COUNT(*) as cnt 
GROUP BY 
    month, 
    bucket; 

과의 값으로 재생 : 당신이 매달 당신은 다음과 같은 문장으로 그렇게 할 수있는 파티션 당 분포를 얻고 싶다면

+0

이미 충분한 양의 데이터가있는 경우, 일련의'SELECT id_column % @partitions as bucket, COUNT (id_column % @partitions)를 cnt GROUP BY (id_column % @partitions)'변수와'@ partitions' 변수의 값이 다른가요? – VMai

+0

@VMai : 그래서'@ partitions'는 변수입니다. 4? 'GROUP BY 1'을 (를) 의미합니까? 실제 ID가 무엇인지에 상관없이 같은 양동이에 떨어지는 수를 계산합니다. – Jim

+0

그래. 원하는 클라이언트 (phpMyAdmin, MySQL Workbench 등)를 사용하고 마지막 명령문의 문장 뒤에'SET @partitions = 4;'를 입력 한 다음 간단히 4를 5로 변경하고 분포. – VMai

답변

1

(I 작은 대신에 크게 모듈로 부분을 의미) variable @partitions. 파티션 사이에 분산되는 방법을 사용할 수있는 데이터 볼 수있는 좋은 방법입니다

SET @partitions = 4; 

SELECT 
    id_column % @partitions as bucket, 
    YEAR(your_date) as year, 
    MONTH(your_date) as month, 
    COUNT(*) as cnt 
GROUP BY 
    year, 
    month, 
    bucket; 

: 타임 라인이 년 이상에 걸쳐있는 경우, 1 년 만 열을 추가합니다.

+0

그러나'your_date '는 수년에 걸친 날짜 유형입니다.이 쿼리는 모든 행의 1 월을 같은 행에 넣을 것입니다. – Jim

+0

시간대별로 매달 원하는 경우 아무 문제가 없습니다. 편집을 참조하십시오. – VMai

+0

왜 4 대신에 @partitions 변수를 직접 사용하고 있는지 궁금합니다. 내가 모르는 일종의 편의입니까? – Jim

관련 문제