database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 8703 게시물 읽기
No. 8703
배열을 사용해도 괜찮을까요?
작성자
심상호(shimsh)
작성일
2010-08-31 13:10
조회수
8,249

약 1000명 정도가 동시에 접속하여 10초에 한번 꼴로 select, update명령을 수행합니다.

명령을 수행하려하면 접속을 하고 명령 수행이 끝나면 접속을 끊습니다.

각 회원의 정보를 27개 컬럼, 200000개 row로 이루어진 테이블에 계속해서 저장하고 있습니다.

각 회원들의 테이블의 성분은 모두 같습니다.

   회원1 테이블(고유번호 int, 컬럼2 int, 컬럼3 int, 컬럼4 int, 컬럼5 int, .....컬럼26 int)

   회원2 테이블(고유번호 int, 컬럼2 int, 컬럼3 int, 컬럼4 int, 컬럼5 int, .....컬럼26 int)

   회원3 테이블(고유번호 int, 컬럼2 int, 컬럼3 int, 컬럼4 int, 컬럼5 int, .....컬럼26 int)

                                   .

                                   .

각 테이블의 고유번호만 인덱스를 만들었습니다.

   이렇게 사용하는 것보다 테이블 컬럼이 모두 같으므로 배열을 사용할까 합니다.

   이렇게 => 회원종합 테이블(고유번호 int, 컬럼2 int[ ], 컬럼3 int[ ], 컬럼4 int[ ], 컬럼5 int[ ], .....컬럼26 int[ ])

"고유번호"만 배열이 아니고, 나머지는 모두 배열입니다.

회원이 1000명이므로 배열의 크기도 1000명이 됩니다.

"고유번호"만 인덱스를 만들면 더 효과적일 같은데요?

이렇게 배열을 크게 만들면 속도나 다른 불이익이 없는지요?

그리고 다른 더 좋은 방법이 없는지요?

 

이 글에 대한 댓글이 총 2건 있습니다.

고유번호가 bigint가 아닌 일반 int형이라면 intarray 라는 contrib를 이용해서 배열 요소를 인덱스 할 수도 있습니다.

접속 맺기와 끊기가 빈번하다면 중간에 pgpool을 설치하셔서 pgsql에서의 세션 생성과 해제에 대한 부담을 없앨 수 있습니다.

 

구조적인 문제는 제가 잘 이해를 못 해서;;

row의 크기가 정해져 있다면 하나의 테이블에 누적하고 성능을 위해서라면 partial index를 고려하시는게 좋을 것 같습니다.

1000개의 요소를 가진 배열 컬럼 26개를 가진 row라.. 저라면 이렇게 하지 않을 것 같습니다.

데이터를 쌓을 때는 row의 수가 적어서 좋을 것 같지만 하나의 row가 크다는 것은 한 row를 가져오려고 할 때 디스크에서 가져와야 하는 데이터가 그만큼 크다는 뜻이 됩니다. 데이터의 크기만 볼 때 108바이트와 104,004바이트는 큰 차이죠.

row의 수를 줄이는 것이 성능에서 중요하다고 생각하시면 partial index로 고유번호에 어떤 룰(예: 고유번호%13)을 이용해 인덱스를 쪼개면 됩니다.

그리고 select 시 배열키(예: 컬럼2[1:2])를 지정해 주지 않으면 배열 컬럼들의 모든 값이 출력될텐데 필요한 값만을 가져오는 것이 DB서버와 네트웍의 부담도 줄이는 방법입니다.

 

신기배(소타)님이 2010-08-31 13:26에 작성한 댓글입니다.
이 댓글은 2010-08-31 13:27에 마지막으로 수정되었습니다.

답변 감사합니다.

각 회원 테이블의 고유번호는 모두 같습니다.

예를 들어

 고유번호 | 회원1    회원2   회원3 .........회원1000

       1      |    0            1            2                    2

       2      |    2            2            1                    1

       3      |    1            1            0                    1

                                           .

                                           .

  200000  |    1            1            0                    1

 

"고유번호"를 인덱스를 만들고 각 회원들의 자료를 읽어나 업데이트를 합니다.

row한 줄을 모두 읽어올 일은 없습니다.

이런 형태로 만들려면 한 테이블에서 만들 수 있는 컬럼의 한계를 넘어버린 것 같아서

배열를 쓰려고 합니다.

 

심상호(shimsh)님이 2010-08-31 16:54에 작성한 댓글입니다.
이 댓글은 2010-08-31 17:24에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
8708DB Connect을 못하겠습니다. [4]
뭉치
2010-09-21
10455
8707PostgreSQL 9.0 now available! [2]
신기배
2010-09-21
9015
8704PostgreSQL 9.0 Release Candidate 1 now available! [3]
김도경
2010-09-01
8193
8703배열을 사용해도 괜찮을까요? [2]
심상호
2010-08-31
8249
8702postgresql 성능 하락 [4]
nowplace
2010-08-30
16265
8701동일 DB의 읽기, 쓰기 서버 분리가 가능할까요? [1]
김병길
2010-08-30
7641
8700Postgresql 에서 Record ID(Page ID, offset)을 알 수 있는 방법이 있나요. [1]
kwangsoo
2010-08-24
8031
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다