나는 전화 요금 청구 소프트웨어 시스템을 가지고 있습니다. 그것에는 사용자의 통화 기록이 매일 기록됩니다. 로그는 날짜 (월)별로 수평 분할됩니다. 각 파티션은 별도의 데이터베이스에 저장되며 여러 인스턴스로 분산 될 수 있습니다.수평 분할 된 데이터를 정렬하는 방법
UI에서 사용자는 기간을 지정합니다. 반환 된 데이터는 모든 필드에서 정렬 할 수 있습니다. 날짜 범위가 여러 파티션으로 확장 될 수 있습니다. 응용 프로그램은 날짜 범위의 데이터를 통해 페이징을 지원해야합니다.
정렬을 위해 너무 많은 레코드를 메모리에로드 할 수 없습니다. 쿼리 내에서 정렬을 수행하면 하나의 결과 집합 내에 정렬 된 데이터 만 제공됩니다.
그래서 개별적으로 정렬 된 여러 파티션의 데이터를 정렬해야합니다. 여러 정렬 된 결과 집합에서 정렬 된 레코드를 UI로 반환하려면 어떻게해야합니까?
편집 :이 문제에 대한 추가 분석을 마친 후에 더 많은 정보를 얻습니다. 페이지 매김의 요구 사항도 있습니다. 이 때문에 우리는 여러 결과 집합에 대해 실시간 정렬을 수행하는 한 가지 방법을 찾아야합니다.
정렬 할 열과 레코드 ID 만로드 한 다음 정렬 된 ID를 기준으로 표시 할 레코드를 정렬하고 마지막으로로드 할 수 있습니다. DB 레벨에서 의미있는 인터리빙을 할 수 있는지 확신하지 못하기 때문에 코드에서 수행하는 것이 가장 쉬운 방법 인 것 같습니다. 또 다른 옵션은 메모리 매핑 된 파일에 (부분) 레코드를 쓰고 정렬하는 것일 수 있습니다.하지만 여기에는 고전적인 속도 - 대 메모리 상황이 모두있는 경우보다 많은 성능이 필요합니다. – Thomas
첫 번째 접근법에 대해 논의했지만이 접근법의 단점은 ID를 사용하여 다시 쿼리해야한다는 것이며 UI에서 나온 것이므로 페이지 매김도 수행해야합니다. –
우리는 모든 데이터를로드하는 데 너무 많은 메모리가 필요했던 비슷한 상황을 겪었습니다. 따라서 ID를 정렬하고 정렬하는 데이터 만 먼저로드 한 다음 ID 만 정렬하고 유지하는 방식을 따랐습니다. 그런 다음 페이징은 정렬 된 ID에 대해 작동하고 페이지의 ID에 해당하는 레코드 만 완전히로드됩니다. 물론 다시 쿼리해야하지만 페이징을 사용하면 어쨌든 그렇게해야합니다. 두 번째 (페이징) 쿼리 속도를 높이려면 원본 파티션을 저장하고 해당 파티션 만 쿼리하면됩니다. – Thomas