티스토리 뷰

반응형

인포믹스에는 blobspace라는 데이터 저장영역이 있습니다. text와 byte 형식의 데이터를 저장할 수 있는 공간인데요.

blobspace의 데이터 이동중에 알게된 정보를 공유하고자 글을 씁니다.

 

<문제의 발단>

pagesize가 2KB인 blobspace의 데이터를 pagesize가 8KB인 blobspace로 이동중 스토리지 부족 오류가 발생했습니다.

기존의 2KB 페이지의 데이터 여러개가 8KB에 들어갈 것이라 생각했는데 그렇지 않았습니다.

IBM Knowledge Center의 문서에도 blobpage에 데이터를 저장하고 남는 공간은 사용하지 않는다고 하네요.

더보기

The storage strategy used to store simple large objects in a blobspace differs from the dbspace storage strategy. The database server does not combine whole simple large objects or portions of a simple large object on a single blobspace blobpage. For example, if blobspace blobpages are 24 kilobytes each, a simple large object that is 26 kilobytes is stored on two 24-kilobyte pages. The extra 22 kilobytes of space remains unused.

www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.adref.doc/ids_adr_0335.htm

 

관련 내용을 샘플 데이터로 테스트 해보았습니다.

 

<시나리오>

1. pagesize가 32KB인 blobspace에 text 데이터 입력

2. stores_demo:catalog 테이블 스키마 사용

3. text 컬럼 cat_advert 한개의 길이는 35바이트

4. 입력할 데이터 건수는 592건

 

먼저 아래와 같이 pagesize가 32KB인 blobspace를 준비합니다.

$ onstat -d

IBM Informix Dynamic Server Version 12.10.FC13WE -- On-Line -- Up 48 days 05:39:35 -- 378608 Kbytes

Dbspaces
address          number   flags      fchunk   nchunks  pgsize   flags    owner    name
700000020478028  1        0x14020001 1        1        4096     N  BAE   informix rootdbs
...
7000000227804a8  14       0x14000011 14       1        32768    N BBAE   informix blobdbs1
 14 active, 2047 maximum

그리고 blobspace blobdbs1에 text 컬럼을 저장하기 위한 테이블을 만듭니다.

create table "informix".mycatalog
  (
    catalog_num serial not null ,
    stock_num smallint,
    manu_code char(3),
    cat_descr text in blobdbs1,
    cat_picture byte,
    cat_advert varchar(255,65)
  );

여기에 샘플 데이터 592건을 입력해봅니다.

$ echo "unload to test select first 1 cat_advert from mycatalog" | dbaccess testdb

1 row(s) unloaded.

$ cat test
Your First Season's Baseball Glove|
$ cat test | wc -m
      36
$ echo "load from mycatalog insert into mycatalog" | dbaccess testdb

592 row(s) loaded.

$ onmode -l
$ echo "select count(*) from mycatalog" | dbaccess testdb

      (count(*))

             592

실제로 데이터의 크기는 35바이트 * 592 이므로 총 20720 바이트이지만 blobspace에서는 어떨까요?

$ oncheck -pB testdb:mycatalog

BLOBSpace Report for testdb:informix.mycatalog

    Total pages used by table        592

    BLOBSpace usage:

        Space          Page                         Percent Full
        Name           Number      Pages   0-25%  26-50%  51-75%  76-100%
        -----------------------------------------------------------------
        blobdbs1       0x1             1    x
        blobdbs1       0x2             1    x
        blobdbs1       0x3             1    x
        blobdbs1       0x4             1    x
...
        blobdbs1       0x24c           1    x
        blobdbs1       0x24d           1    x
        blobdbs1       0x24e           1    x
        blobdbs1       0x24f           1    x
        blobdbs1       0x250           1    x
                                  ------
          Page Size is 32768         592

oncheck -pB명령으로 해당 테이블의 blobspace 정보를 살펴보았습니다. 총 592 페이지를 사용했고 pagesize는 32768 바이트이므로 총 20611072 바이트만큼 차지합니다. 원래 데이터의 크기와 비교할 때 약 1000배의 차이가 나는군요.

결론적으로 blobspace에 데이터는 각 row의 컬럼별로 blobpage를 1페이지씩 차지하게 됩니다. text와 byte 데이터 크기가 blobpage의 pagesize에 비해 현저히 작을때 저장공간이 매우 비효율적으로 사용될 수 있겠네요.

 

blobspace에 대한 이해도 부족으로 인한 시행착오였습니다.

 

반응형
댓글