My Books

My Slides

rss 아이콘 이미지

2017년 8월 PostgreSQL 1-Day 튜닝 교육 자료입니다.

PostgreSQL 2017.07.31 20:46 Posted by 시연아카데미

2017년 8월 교육을 위해서 기존 교육 자료에 아래의 내용을 추가했습니다.

 

아키텍처

  •  PostgreSQL Plan Caching과 Oracle Shared Pool 비교
  •  Unlogged 테이블, Temporary 테이블, 일반 테이블 속성 및 성능 비교
  •  Modulo 연산을 이용한 XID 비교 로직 
  •  파티션 개수에 따른 입력 성능 테스트 (버전 9.6 및 10)

 

옵타마이저

  • 클래식 해시 조인 수행 절차 
  • Grace 해시 조인 수행 절차 
  • Simple View Merging 예제 변경  
  • JPPD 예제 변경 및 JPPD 구현 방안 추가

 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Modulo 연산을 이용한 PostgreSQL XID 비교 로직 설명

PostgreSQL 2017.07.11 23:11 Posted by 시연아카데미

PostgreSQL은 XID 간의 비교를 위해서 Modulo 연산을 사용합니다. 

 

개념은 간단합니다.

 

현재 XID 기준으로 2^31 (대략 20억) 이전 데이터는 OLD 데이터이고, 2^31 이후 데이터는 NEW 데이터라는 개념입니다.

 

그런데 수치를 대입해서 계산해보면 이해가 되지 않는 부분이 있습니다.

 

그동안은 그냥 그러려니 하고 넘겼던 부분인데, 6월 수강자 분중에서 이 부분을 질문하신 분이 계셔서 조금 더 자세히 정리했습니다.

 

Modulo 연산을 이용한 PosgreSQL XID 비교 로직 설명 from 시연아카데미

 

D1, ID2 값을 입력하면서 직접 확인해보고 싶은 분들은 아래의 C-Source를 이용해보세요.

 

컴파일 및 사용 예제

 

$ cc -o comp comp.c

$ comp 4294967295 3
id1=(unsigned int) 4294967295            id1=(int) -1
id2=(unsigned int) 3                          id2=(int) 3
[DEBUG] diff = (int) (id1 - id2) => [-4]
[DEBUG] return (diff < 0)
[1] = Result of TransactionIdPrecedes(id1,id2)

 

comp.c

 

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

typedef unsigned int TransactionId;
#define TransactionIdIsNormal(xid)           ((xid) >= 3)

bool
TransactionIdPrecedes(TransactionId id1, TransactionId id2)
{
        /*
         ** If either ID is a permanent XID then we can just do unsigned
         ** comparison.  If both are normal, do a modulo-2^32 comparison.
         **/
        int           diff;

        if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) {
                printf("[DEBUG] id1 or id2 isn't a Normal XID, Therefore, it does not perform 2^31 modular operations\n");
                printf("[DEBUG] return (id1 < id2), id1=%u id2=%u\n", id1, id2);
                return (id1 < id2);
        }

        diff = (int) (id1 - id2);
        printf("[DEBUG] diff = (int) (id1 - id2) => [%d] \n", (int) (id1 - id2));
        printf("[DEBUG] return (diff < 0) \n");

        return (diff < 0 );
}

main(int argc, char *argv[])
{
        TransactionId id1;
        TransactionId id2;
        int res;

        if (argc != 3) {
                printf("usage> comp <id1> <id2>\n");
                exit(-1);
        }

        id1 = atoi(argv[1]);
        id2 = atoi(argv[2]);

        printf("id1=(unsigned int) %u\t\t id1=(int) %d\n", id1, id1);
        printf("id2=(unsigned int) %u\t\t id2=(int) %d\n", id2, id2);

        printf("[%d] = Result of TransactionIdPrecedes(id1,id2)\n", TransactionIdPrecedes(id1, id2));
}

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


 

티스토리 툴바