TiDB 소스 코드 읽 기 시리즈 글 (10) Chunk 와 실행 프레임 워 크 소개
TiDB 2.0 에서 저 희 는 Chunk 라 는 데이터 구 조 를 도입 하여 메모리 에 내부 데 이 터 를 저장 하고 메모리 의 배분 비용 을 줄 이 며 메모리 의 점용 을 낮 추고 메모리 사용량 통계 / 통 제 를 실현 합 니 다. 그 특징 은 다음 과 같 습 니 다.
1. Column
Column 의 구현 은 Apache Arrow, Column 의 코드 를 참고 합 니 다. 여기 요.저 장 된 데이터 형식 에 따라 저 희 는 두 가지 Column 이 있 습 니 다.
Double
, Bigint
, Decimal
등 Char
, Varchar
등 Column 안에 필드 가 매우 많 습 니 다. 여기 서 간단하게 소개 하 겠 습 니 다.
NULL
특별한 주의 가 필요 한 것 은 우리 가 0 표 시 를 사용 하 는 것 이다. NULL
, 1 은 비 NULL
, Apache Arrow 와 같 습 니 다.1.1 길이 가 아 닌 NULL 값 을 추가 합 니 다.
하나의 요 소 를 추가 하려 면 구체 적 인 데이터 형식 에 따라 구체 적 인 append 방법 을 호출 해 야 합 니 다. 예 를 들 어 appendInt 64, appendString 등 입 니 다. 기다리다
길이 가 정 해진 Column 은 다음 그림 과 같이 표시 할 수 있 습 니 다.
우리 appendInt64 예 를 들 어 정 해진 형식의 데 이 터 를 추가 하 는 방법 을 살 펴 보 자.
NULL
append 할 데 이 터 를 먼저 복사 합 니 다. elemBuf 가운데위 에서 첫 번 째 단 계 는...
unsafe.Pointer
이 함수 에서 완성, 두 번 째, 세 번 째 단 계 는... finishAppendFixed 이 함수 에서 완성 되 었 습 니 다.다른 고정 유형 요소 의 추가 조작 은 매우 비슷 하 다. 관심 이 있 는 학생 들 은 이어서 appendFloat 32, appendTime 을 볼 수 있다. 등 함수.1.2 길 어 지 는 비 NULL 값 추가
길 어 지 는 Column 은 다음 그림 으로 표시 할 수 있 습 니 다.
우리 appendString 을 예 로 들 어 길 어 지 는 형식의 데 이 터 를 추가 하 는 방법 을 보 겠 습 니 다.
위 에서 첫 번 째 단 계 는... appendString 이 함수 에서 완성, 두 번 째, 세 번 째 단 계 는... finishAppendVar 이 함수 에서 완성 되 었 습 니 다.다른 변 장 유형 요소 의 추가 조작 도 매우 비슷 하 다. 관심 이 있 는 학생 들 은 이어서 appendBytes, appendJSON 을 볼 수 있다. 등 함수.
1.3 NULL 값 추가
우리 appendNull 함수 가 Column 에 하 나 를 추가 합 니 다.
appendInt64
값:2. Row
위의 그림 에서 보 듯 이 Chunk 의 Row 는 논리 적 인 개념 이다. Row 의 데 이 터 는 Chunk 의 각 Column 에 저장 되 고 같은 Row 의 데 이 터 는 메모리 에 연속 으로 저장 되 지 않 으 며 우 리 는 Row 대상 을 가 져 올 때 데이터 복사 가 필요 하지 않다.Row 의 개념 을 제공 하 는 것 은 산 자가 운행 하 는 과정 에서 대부분 Row 단위 로 데 이 터 를 방문 하고 조작 하기 때문이다. 예 를 들 어 집합, 정렬 등 이다.
Row 는 GetInt 64, GetString, GetMyDecimal 등 Chunk 의 데 이 터 를 얻 는 방법 을 제공 합 니 다. 등, 앞에서 Column 에 append 데 이 터 를 가 져 오 는 방법 을 소 개 했 습 니 다. 데 이 터 를 가 져 오 는 방법 은 append 데 이 터 를 반추 할 수 있 고 코드 도 간단 합 니 다. 여기 서 더 이상 상세 하 게 소개 하지 않 겠 습 니 다.
3. 쓰다
현재 Chunk 라 는 가방 은 대외 적 으로 Chunk, Row 등 인터페이스 만 노출 되 고 Column 이 노출 되 지 않 았 기 때문에 데 이 터 를 쓰 는 것 은 Chunk 에서 실 현 된 Column 의 구체 적 인 함수 에 대한 warpper 입 니 다. 예 를 들 어 AppendInt64;데 이 터 를 읽 는 것 은 Row 에서 실 현 된 Getxxx 함수 입 니 다. 예 를 들 어 GetInt64。
실행 프레임 워 크 소개
1. 오래된 실행 프레임 워 크 안내
재 구성 하기 전에 TiDB 1.0 에서 사용 하 는 실행 프레임 워 크 는 Child 의 Next 함 수 를 계속 호출 하여 Datum 으로 구 성 된 Row (방금 소개 한 Chunk Row 와 두 개의 데이터 구조) 를 가 져 옵 니 다. 이러한 실행 방식 은 함수 가 호출 될 때마다 한 줄 의 데이터 만 되 돌려 주 고 어떤 유형의 데 이 터 를 Datum 이라는 구조 체 로 포장 하 는 것 이 특징 입 니 다.
이런 방법의 장점 은 간단 하고 사용 하기 쉽다 는 것 이다.단점 은:
2. 새 실행 프레임 워 크 소개
재 구성 후 TiDB 2.0 에서 사용 하 는 실행 프레임 워 크 는 Child 를 계속 호출 합 니 다. NextChunk 함수, Chunk 데 이 터 를 가 져 옵 니 다.
이런 집행 방식 의 특징 은:
NULL
입 니 다. 기본 값 은 1024 줄 입 니 다.TiDB 는 TP 와 AP 를 혼합 한 데이터베이스 이기 때문에 AP 유형의 조회 에 있어 서 는 계 산 된 데 이 터 량 이 많 기 때문에 1024 는 문제 가 없 지만 TP 요청 에 있어 서 는 계 산 된 데 이 터 량 이 비교적 적 을 수 있 으 며, 1024 줄 의 메모 리 를 처음부터 분배 하 는 것 이 최선 의 실천 은 아니다.(여기 github issue 가 이 문 제 를 토론 하고 있 습 니 다. 관심 있 는 친구 들 이 토론 하고 해결 하 는 것 을 환영 합 니 다) 새로운 실행 프레임 워 크 를 사용 한 후에 OLAP 형식 문장의 실행 속도, 메모리 사용 효율 이 크게 향상 되 었 습 니 다. TPC - H 대비 결과 성능 이 양 적 으로 향상 됐다.
지은 이
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.