몰랐던 내용, 한수 배웠습니다.
64K가 제한이니까, 10,000 컬럼이면 정수형 정도만 가능하겠군요.
그러나 이렇게 프로그램을 짜는건 미친 짓(???!!!!)이 아닐런지...
DevExpress 제품 중에 피벗 그리드란게 있는데, 이넘은 서버에서 raw 데이터를 가지고와서
원하는 형태로 피벗 테이블을 구성해주더군요.
박지훈.임프 님이 쓰신 글 :
: 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개 정도는 되었으면 좋겠는데요..)
: :
: : 더 좋은 방법이 있다면 알려주시면 감사하겠습니다. 읽어주셔서 감사합니다.
|