database - 파티셔닝 - 파티션 테이블 단점




데이터베이스 파티션-수평 대 수직-표준화와 행 분리의 차이점은 무엇입니까? (3)

데이터베이스의 가로 분할

모든 분야를 지킴 EG : 표 Employees

  • 신분증,
  • 이름,
  • 지리적 위치,
  • 이메일,
  • 지정,
  • 전화

EG : 1. 모든 필드를 유지하고 여러 컴퓨터에 레코드를 배포합니다. id = 1-100000 또는 100000-200000 레코드를 하나의 시스템에 각각 저장하고 여러 시스템에 분배합니다.

EG : 2. 지역별 데이터베이스 수집 EG : 아시아 태평양, 북미

키 : 기준에 따라 행 세트 선택

데이터베이스의 세로 분할

동일한 테이블이 여러 테이블로 분할되고 필요한 경우 조인과 함께 사용되는 정규화와 유사합니다.

EG : id , name , designation 이 하나의 테이블에 저장됩니다.
phone , 자주 액세스하지 않을 수있는 email 은 다른 곳에 저장됩니다.

키 : 기준에 따라 열 집합을 선택합니다.

  • 수평 / 수직 스케일링은 파티셔닝과 다릅니다.

수평 확장 :

데이터베이스를 포함하여 모든 시스템의 응답 성 및 가용성을 향상시킬 수 있도록 더 많은 시스템을 추가하는 것입니다.이 아이디어는 작업 부하를 여러 시스템에 분산시키는 것입니다.

수직 확장 :

기존 머신이나 머신에 CPU, 메모리 등의 기능을 추가하여 데이터베이스를 포함한 모든 시스템의 응답 성 및 가용성을 향상시킬 수 있습니다. 가상 머신을 설정하면 실제로 물리적 머신을 추가하는 대신 가상 머신을 구성 할 수 있습니다.

Sameer Sukumaran

나는 Database Partitioning 의 다른 개념을 이해하기 위해 노력하고 있는데, 이것이 내가 그것을 이해 한 이유이다 :

수평 분할 / 샤딩 (Horizontal Partitioning / Sharding) : 초기 테이블에 있던 행의 하위 집합을 포함하는 다른 테이블로 테이블 분할하기 (예 : North America의 하위 테이블과 같이 대륙별로 Users 테이블을 분할하는 경우 많이 본 예제, 유럽을위한 또 다른 하나, 등). 각 파티션은 서로 다른 물리적 위치에 있습니다 ( '기계'를 이해함). 내가 이해하기에, 수평 분할과 샤딩은 똑같은 것이다 (?).

수직 분할 : 내가 이해 한 것 ( http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx )에는 수직 분할의 2 종류가 있습니다.

  • 정규화 (테이블을 분할하고 외부 키와 연결하여 데이터베이스에서 중복 제거).

  • 행 분할 , 여기 내가 이해하지 못하는 것, 정규화행 분할 의 차이점은 무엇입니까? 이 두 기술이 서로 다른 점은 무엇입니까?

나는 수평 적 분할과 수직 분할의 차이점은 처음에 더 많은 기계를 추가하여 확장하는 반면, 두 번째는 더 많은 전력을 추가하여 확장한다는 점이다 ( 수평 적 및 수직적 데이터베이스 스케일링 의 차이점) CPU, RAM)을 기존 컴퓨터에 설치했는지 여부가 정확한 정의입니까? 나는이 두 기술의 핵심 차이점이 테이블 분할 방식에 있다고 생각했습니다.

나는 질문이 많아서 유감 스럽지만 나는 여러 웹 사이트들이 서로 다른 것을 말하기 때문에 혼란 스럽다.

명확히 밝혀진 도움은 크게 감사하겠습니다. 테이블이 몇 개있는 명확하고 간단한 데모 링크는 매우 유용합니다.


단일 데이터베이스의 문제점은 거대 해지기 시작할 때 발생합니다. 따라서 검색 공간을 줄이기 위해 파티션을 필요로하므로 필요한 작업을 빠르게 실행할 수 있습니다. 수평 분할, 수직 분할, 해시 기반 분할, 조회 기반 분할 등 다양한 파티션 전략을 사용할 수 있습니다. 수평, 수직 스케일링은 이러한 전략과 다른 개념입니다.

  1. 수평 분할 : 수평 분할은 여러 노드 / 기계에 여러 개의 테이블을 가지므로 올바른 테이블을 얻는 데 도움이되는 몇 가지 주요 정보를 기반으로 주어진 테이블 / 모음을 여러 테이블 / 모음으로 나눕니다. 예 : 지역 현명한 사용자 정보.

  2. 세로 분할 : 위의 답변 중 하나와 같이 열을 여러 부분으로 나눕니다. 예 : 소셜 네트워킹 응용 프로그램의 사용자 정보, 좋아요, 댓글, 친구 등의 열.

  3. 해시 기반 파티셔닝 : 해시 함수를 사용하여 테이블 / 노드를 결정하고 해시 생성시 키 요소를 입력으로 사용합니다. 테이블의 수를 변경하면 비용이 많이 드는 데이터의 재 배열이 필요합니다. 그래서 테이블 / 노드를 더 추가하려고 할 때 문제가 있습니다.

  4. 조회 기반 분할 : 주어진 입력 필드에서 다른 테이블 / 노드 기반으로 리디렉션하는 데 도움이되는 조회 테이블을 사용합니다. 우리는이 접근법에서 새로운 테이블 / 노드를 쉽게 추가 할 수 있습니다.

수평 스케일링 vs 수직 스케일링 : 애플리케이션을 설계 할 때 스케일링도 고려해야합니다. 우리는 앞으로 어떻게 막대한 양의 트래픽을 처리 할 것인가? 우리는 메모리 소비, 대기 시간, CPU 사용량, 내결함성, 탄력성의 관점에서 생각할 필요가 있습니다. 수직 확장은 더 많은 리소스를 예 : CPU, 메모리를 단일 시스템에 추가하여 향후 트래픽을 처리 할 수 ​​있도록합니다. 하지만이 방법에는 한계가 있습니다. 특정 제한보다 더 많은 리소스를 추가 할 수 없습니다. 수평 확장은 들어오는 트래픽이 여러 노드에 분산되도록합니다. 기본적으로 트래픽을 처리하고 어느 한 노드로 트래픽을 탐색하는로드 밸런서가 앞에 있어야합니다. 수평 확장을 통해 충분한 수의 서버를 추가 할 수 있지만 이러한 많은 노드가 필요할 수도 있습니다.


파티셔닝은 다소 일반적인 개념이며 많은 상황에서 적용될 수 있습니다. 관계형 데이터 의 분할을 고려할 때 일반적으로 테이블을 행별로 (가로로) 또는 열별로 (세로로) 분해합니다.

수직 파티셔닝, 즉 행 분할은 데이터베이스 정규화와 동일한 분할 기법을 사용하지만 일반적으로 용어 (수직 / 수평) 데이터 분할은 물리적 최적화를 말하며 정규화는 개념적 레벨의 최적화를 의미합니다.

간단한 데모를 요청하기 때문에 다음과 같은 표가 있다고 가정합니다.

create table data (
    id integer primary key, 
    status char(1) not null, 
    data1 varchar2(10) not null, 
    data2 varchar2(10) not null);

data 세로 로 분할 data 한 가지 방법은 다음과 같이 분할하는 것입니다.

create table data_main (
    id integer primary key,
    status char(1) not null,
    data1 varchar2(10) not null );

create table data_rarely_used (
    id integer primary key,
    data2 varchar2(10) not null,
    foreign key (id) references data_main (id) );

이러한 종류의 파티셔닝은 쿼리에 열 데이터 2가 거의 필요없는 경우와 같이 적용 할 수 있습니다. data_main 분할 영역은 공간을 덜 차지하므로 전체 테이블 스캔이 더 빠르며 DBMS의 페이지 캐시에 적합 할 가능성이 높습니다. 단점 : 모든 data 열을 쿼리해야 할 때 obivously 테이블을 조인해야하므로 원본 테이블을 쿼리하는 것이 더 비쌉니다.

테이블을 정규화 할 때와 같은 방법으로 열을 분할합니다. 그러나이 경우 data 는 이미 3NF (BCNF 및 4NF조차도)로 정규화 될 수 있지만 물리적 최적화의 이유로 더 분할하기로 결정했습니다.

Oracle 구문을 사용하여 data 수평 분할 data 한 가지 방법은 다음과 같습니다.

create table data (
    id integer primary key, 
    status char(1), 
    data1 varchar2(10), 
    data2 varchar2(10) )
    partition by list (status) ( 
       partition active_data values ( 'A' ),
       partition other_data values(default) 
    );

이것은 DBMS에 열 status 의 값에 따라 내부적으로 테이블 data 를 두 개의 세그먼트와 같은 두 개의 세그먼트로 저장하도록 지시 status . 이런 방식으로 data 를 분할 data 것은 예를 들어 일반적으로 한 파티션의 행 (예 : 상태 'A'행)을 쿼리 할 때 적용 할 수 있습니다 (활성 행이라고 부름). 이전과 마찬가지로 전체 스캔 속도가 빨라졌습니다 (특히 활성 행이 거의없는 경우) 활성 행 (및 다른 행 resp)은 연속적으로 저장됩니다 (다른 행의 행과 공유하는 페이지 주위에 흩어지지 않습니다) 상태 값을 가지며 활성 행이 페이지 캐시에있을 확률이 높습니다.





database-partitioning