There is not a "column count limit". The maximum width of a row is
64 Kb, minus a few bytes. Add up the byte count for the declared
size of each column, counting 8 bytes for each BLOB or ARRAY type
column, and adding 2 bytes for each VARCHAR column. Integers,
floats, date, time are 4 bytes; BigInt, double precision, timestamp
are 8; numeric and decimal, 4 (if precision < 10) or 8 otherwise.
간단히 번역하자면, 컬럼 갯수의 한계는 없으며, 한 로우의 크기가 64 Kb(몇 바이트 제외)로 제한되어 있다는 것입니다. 테이블 내에 정의된 모든 컬럼들의 크기를 더했을 때 이 로우 크기 제한을 넘어가지만 않으면 된다네요. BLOB나 ARRAY 타입은 8바이트, VARCHAR 타입은 정의된 크기+2바이트로 계산하고, 정수, 실수, 날짜, 시간 타입 등은 4바이트, 그외 BigInt 등등은 8바이트 등등입니다.
하지만 다른 문서들을 뒤져보면, 한 테이블의 컬럼 갯수 제한이 32767개라는 글도 있습니다. 아마도 이것이 어드레싱을 위한 실제 물리적인 제한인 듯 합니다. 위 글에서 컬럼 갯수에 제한이 없다고 쓴 것은 32767이라는 갯수가 컬럼 수로는 너무 어마어마하게 커서 사실상 크기 제한이 무의미하다는 뜻인 듯 합니다.
그리고, select에서도 과연 이렇게 될 것이냐... 뭐 상식적으로 보면 된다고 봐야겠지요. 한 테이블의 필드 갯수를 모두 셀렉트하지 못한다면 문법이 앞뒤가 안맞는 거겠죠? 실제로 간단히 테스트를 해봤습니다.
select
count(*),
count(*),
...
count(*)
from 테이블이름
여기서 저는 count(*)를 1990번 반복해봤습니다. 실행이 잘 되더군요. 단, 결과가 나오는 속도로 봐서는 별로 간단한 테스트는 아니었습니다. IBExpert에서 실행했는데, 컬럼이 너무 많으니까 IBExpert가 한참동안(거의 3~4분?) 반응이 없다가 결과가 나오더군요. 실제로 1990번 컬럼까지 결과가 나옵니다.
10,000개를 원하시면.. 위와 같은 방법으로 테스트해보실 수 있을 겁니다. 근데.. 아마도 거의 시간 단위로 기다려야 하지 않을까 싶네요. 다른 방법을 찾는 게 낫지 않을까 싶은데요.
그럼...
불새 초보 님이 쓰신 글 :
: 안녕하세요?
:
: SELECT
: o.job_grade,
: count(CASE o.job_code WHEN 1 THEN o.EMP_NO ELSE NULL end) as v1,
: count(CASE o.job_code WHEN 2 THEN o.EMP_NO ELSE NULL end) as v2,
: count(CASE o.job_code WHEN 3 THEN o.EMP_NO ELSE NULL end) as v3,
: .
: .
: .
: count(CASE o.job_code WHEN 999 THEN o.EMP_NO ELSE NULL end) as v999
: FROM
: employee o
: GROUP BY o.job_grade
:
: 이런 식의 쿼리로 cross table(pivot table)을 만드려고 합니다.
: 그런데 데이터에 따라 count(case ...)로 생성하는 필드가 많아질 수도 있을 것아
: 최대 몇개까지 가능한지 궁금합니다. (10,000개 정도는 되었으면 좋겠는데요..)
:
: 더 좋은 방법이 있다면 알려주시면 감사하겠습니다. 읽어주셔서 감사합니다.
|