2016-11-23 1 views
1

몇 대의 컴퓨터에서 일부 작업을 수행합니다. 행을 각 기계에 대해 동일한 부분으로 나누어야합니다. 모든 조건이 오랜 시간 수행 된 쿼리. 하나의 쿼리에서 추가 요청 수 (*)없이이 작업을 수행 할 수 있습니까? 이 같은 일부 :오프셋 카운트 (*)/N 열

각 기계 같은 수의 행을 원하는 경우에
select * from some_table 
where some_rows = some_values 
offset (count(*)/count_machines) * (machine_number - 1) 
limit count(*)/count_machines 
+0

당신은 샘플 데이터 및 원하는 결과를 제공 할 수 있습니까? 당신이 정말로하고 싶은 것이 불분명합니다. "각 기계의 동일한 부품에 대해 행을 나누어야합니까?"는 의미는 무엇입니까? –

+0

테이블의 행 개수 = 100이고 4 개의 시스템이 있습니다. 첫 번째 기기는 1-25 행, 2 : 26-50, 3 : 51-75, 4 : 76-100을 가져야합니다. –

답변

1

는 신분증에 대한 간단한 모듈이다.

(당신은 모듈로 발현에 함수 색인이 속도를 높일 수있는 기계의 수는 정적 제공 당신은 더 자주이 필요합니다.)

0

, 다음 row_number()을 사용

select t.* 
from (select t.*, 
      row_number() over (partition by machine order by machine) as seqnum 
     from some_table t 
     where . . . 
    ) t 
where seqnum <= 10; 
0

가 바퀴를 재발견하지 마십시오.
레코드의 값에 해시 함수를 사용하고 레코드 수를 유지할 기계를 얻기 위해 기계 수를 모듈로 계산하십시오. 값을 잘 선택하면 좋은 배포와 좋은 실적을 얻을 수 있으며 각 레코드의 위치를 ​​알 수 있습니다.

select * from some_table 
where some_rows = some_values 
and mod(id, BLOCKS) = BLOCK - 1; 

숫자와 기계의 수와 블록과 블록을 교체 n은 1에서 N 블록을 검색하는 블록 : 나는 언젠가 블록으로 데이터를 분할 할 무엇