InfoGrab DocsInfoGrab Docs

Int range 파티셔닝

요약

int 범위 파티셔닝을 새로 사용하지 않습니다. 셀 사이에서 데이터를 마이그레이션할 때는 해당 키 범위의 파티션이 대상 셀에 이미 존재해야 합니다. int 범위 파티셔닝은 큰 테이블을 정수 칼럼을 기준으로 더 작고 관리하기 쉬운 단위로 나누는 기법으로, 각 파티션이 하나의 정수 범위를 담습니다.

Warning

int 범위 파티셔닝을 새로 사용하지 않습니다. 셀과 호환되지 않아 더 이상 사용하지 않습니다.

셀 사이에서 데이터를 마이그레이션할 때는 해당 키 범위의 파티션이 대상 셀에 이미 존재해야 합니다. 더 근본적으로 파티션 구성은 셀 내부의 구현 세부 사항이지 셀 간 마이그레이션 계약의 일부가 아닙니다. 따라서 대상 셀이 원본 셀의 파티셔닝 방식을 몰라도 셀 간 데이터 마이그레이션이 가능해야 합니다. 자세한 내용은 작업 항목 604729를 참고합니다.

설명#

int 범위 파티셔닝은 큰 테이블을 정수 칼럼을 기준으로 더 작고 관리하기 쉬운 단위로 나누는 기법으로, 각 파티션이 하나의 정수 범위를 담습니다. 행 수가 많은 테이블에 특히 유용하며, 쿼리 성능을 크게 높이고 스토리지 요구량을 줄이며 유지 관리 작업을 단순하게 만듭니다. 이 파티셔닝 방식이 제대로 작동하려면 대부분의 쿼리가 특정 int 범위의 데이터에 접근해야 합니다.

좀 더 자세히 살펴보기 위해 단순화한 merge_request_diff_files 스키마를 가정합니다.

CREATE TABLE merge_request_diff_files (
  merge_request_diff_id INT NOT NULL,
  relative_order INT NOT NULL,
  PRIMARY KEY (merge_request_diff_id, relative_order));

이제 UI의 일반적인 쿼리가 특정 int 범위의 데이터를 표시한다고 가정합니다.

SELECT *
FROM merge_request_diff_files
WHERE merge_request_diff_id > 1 AND merge_request_diff_id < 10
LIMIT 100

merge_request_diff_id 칼럼으로 테이블을 파티셔닝하면 기본 테이블은 다음과 같습니다.

CREATE TABLE merge_request_diff_files (
  merge_request_diff_id INT NOT NULL,
  relative_order INT NOT NULL,
  PRIMARY KEY (merge_request_diff_id, relative_order))
PARTITION BY RANGE(merge_request_diff_id);
Note

파티셔닝된 테이블의 기본 키 정의에는 파티션 키가 반드시 포함돼야 합니다.

그리고 이 테이블의 파티션 목록은 다음과 같을 수 있습니다.

merge_request_diff_files_1 FOR VALUES FROM (1) TO (20)
merge_request_diff_files_20 FOR VALUES FROM (20) TO (40)
merge_request_diff_files_40 FOR VALUES FROM (40) TO (60)

각 파티션은 기본 merge_request_diff_files 테이블과 구조가 같은 별도의 물리 테이블이며, 파티션 키가 지정된 범위에 속하는 행의 데이터만 담습니다. 예를 들어 merge_request_diff_files_1 파티션은 merge_request_diff_id 칼럼 값이 1 이상이고 20 미만인 행을 담습니다.

앞의 예시 쿼리를 다시 보면, 데이터베이스는 WHERE 절을 통해 조건에 맞는 모든 행이 merge_request_diff_files_1 파티션에 있다는 것을 인식할 수 있습니다. 모든 파티션의 데이터를 전부 검색하는 대신 해당 파티션의 데이터만 검색하면 됩니다. 큰 테이블에서는 이 방식으로 데이터베이스가 접근해야 하는 데이터 양을 크게 줄일 수 있습니다.

ActiveRecord 모델#

int 범위 파티셔닝 전략을 사용하는 ActiveRecord 모델에는 아래 예시와 같은 partitioned_by 호출이 들어갑니다. PartitionManager가 파티션을 동적으로 생성하는 방법을 알려면 이 호출이 필요합니다.

  PARTITION_SIZE = 2_000_000
  partitioned_by :namespace_id, strategy: :int_range, partition_size: PARTITION_SIZE

파티션 크기는 예상되는 테이블 증가량을 기준으로 정합니다.

config/initializers/postgres_partitioning.rb 파일에서 파티션 매니저에 모델을 등록하는 일도 잊지 않습니다.

파티셔닝된 테이블에서 시퀀스로 뒷받침되지 않는 칼럼으로 테이블을 파티셔닝한다면 해당 칼럼의 sequence_name을 정의합니다. 파티션 매니저가 새 파티션을 만들 때 올바른 min_id를 가져오려면 이 설정이 필요합니다.

partitioned_by :project_id, strategy: :int_range, partition_size: 2_000_000, sequence_name: 'projects_id_seq'

Int range 파티셔닝

GitLab v19.4
원문 보기

요약

int 범위 파티셔닝을 새로 사용하지 않습니다. 셀 사이에서 데이터를 마이그레이션할 때는 해당 키 범위의 파티션이 대상 셀에 이미 존재해야 합니다. int 범위 파티셔닝은 큰 테이블을 정수 칼럼을 기준으로 더 작고 관리하기 쉬운 단위로 나누는 기법으로, 각 파티션이 하나의 정수 범위를 담습니다.

Warning

int 범위 파티셔닝을 새로 사용하지 않습니다. 셀과 호환되지 않아 더 이상 사용하지 않습니다.

셀 사이에서 데이터를 마이그레이션할 때는 해당 키 범위의 파티션이 대상 셀에 이미 존재해야 합니다. 더 근본적으로 파티션 구성은 셀 내부의 구현 세부 사항이지 셀 간 마이그레이션 계약의 일부가 아닙니다. 따라서 대상 셀이 원본 셀의 파티셔닝 방식을 몰라도 셀 간 데이터 마이그레이션이 가능해야 합니다. 자세한 내용은 작업 항목 604729를 참고합니다.

설명#

int 범위 파티셔닝은 큰 테이블을 정수 칼럼을 기준으로 더 작고 관리하기 쉬운 단위로 나누는 기법으로, 각 파티션이 하나의 정수 범위를 담습니다. 행 수가 많은 테이블에 특히 유용하며, 쿼리 성능을 크게 높이고 스토리지 요구량을 줄이며 유지 관리 작업을 단순하게 만듭니다. 이 파티셔닝 방식이 제대로 작동하려면 대부분의 쿼리가 특정 int 범위의 데이터에 접근해야 합니다.

좀 더 자세히 살펴보기 위해 단순화한 merge_request_diff_files 스키마를 가정합니다.

CREATE TABLE merge_request_diff_files (
  merge_request_diff_id INT NOT NULL,
  relative_order INT NOT NULL,
  PRIMARY KEY (merge_request_diff_id, relative_order));

이제 UI의 일반적인 쿼리가 특정 int 범위의 데이터를 표시한다고 가정합니다.

SELECT *
FROM merge_request_diff_files
WHERE merge_request_diff_id > 1 AND merge_request_diff_id < 10
LIMIT 100

merge_request_diff_id 칼럼으로 테이블을 파티셔닝하면 기본 테이블은 다음과 같습니다.

CREATE TABLE merge_request_diff_files (
  merge_request_diff_id INT NOT NULL,
  relative_order INT NOT NULL,
  PRIMARY KEY (merge_request_diff_id, relative_order))
PARTITION BY RANGE(merge_request_diff_id);
Note

파티셔닝된 테이블의 기본 키 정의에는 파티션 키가 반드시 포함돼야 합니다.

그리고 이 테이블의 파티션 목록은 다음과 같을 수 있습니다.

merge_request_diff_files_1 FOR VALUES FROM (1) TO (20)
merge_request_diff_files_20 FOR VALUES FROM (20) TO (40)
merge_request_diff_files_40 FOR VALUES FROM (40) TO (60)

각 파티션은 기본 merge_request_diff_files 테이블과 구조가 같은 별도의 물리 테이블이며, 파티션 키가 지정된 범위에 속하는 행의 데이터만 담습니다. 예를 들어 merge_request_diff_files_1 파티션은 merge_request_diff_id 칼럼 값이 1 이상이고 20 미만인 행을 담습니다.

앞의 예시 쿼리를 다시 보면, 데이터베이스는 WHERE 절을 통해 조건에 맞는 모든 행이 merge_request_diff_files_1 파티션에 있다는 것을 인식할 수 있습니다. 모든 파티션의 데이터를 전부 검색하는 대신 해당 파티션의 데이터만 검색하면 됩니다. 큰 테이블에서는 이 방식으로 데이터베이스가 접근해야 하는 데이터 양을 크게 줄일 수 있습니다.

ActiveRecord 모델#

int 범위 파티셔닝 전략을 사용하는 ActiveRecord 모델에는 아래 예시와 같은 partitioned_by 호출이 들어갑니다. PartitionManager가 파티션을 동적으로 생성하는 방법을 알려면 이 호출이 필요합니다.

  PARTITION_SIZE = 2_000_000
  partitioned_by :namespace_id, strategy: :int_range, partition_size: PARTITION_SIZE

파티션 크기는 예상되는 테이블 증가량을 기준으로 정합니다.

config/initializers/postgres_partitioning.rb 파일에서 파티션 매니저에 모델을 등록하는 일도 잊지 않습니다.

파티셔닝된 테이블에서 시퀀스로 뒷받침되지 않는 칼럼으로 테이블을 파티셔닝한다면 해당 칼럼의 sequence_name을 정의합니다. 파티션 매니저가 새 파티션을 만들 때 올바른 min_id를 가져오려면 이 설정이 필요합니다.

partitioned_by :project_id, strategy: :int_range, partition_size: 2_000_000, sequence_name: 'projects_id_seq'