2010. 11. 26. 17:40
[질문]

대용량 엑셀의 데이터에서 몇가지 조건을 걸고 수식 계산하는 일을 최근 자주 하고 있습니다. 

no 회원명 제품명 구매일자 금액 구매대리점
1 김과장 A1 2010-10-01    10,000 강남점
2 이대리 B2 2010-10-02    20,000 서초점
3 최수석 A2 2010-10-03    15,000 송파점
4 김과장 A1 2010-10-04    10,000 분당점
5 이대리 C2 2010-10-05    30,000 일산점
6 최수석 B2 2010-10-06    20,000 부천점
7 소지섭 C2 2010-10-07    30,000 강남점
8 홍길동 C1 2010-10-08    50,000 분당점

예를 들어 위와 같은 시트가 있다면,
1. 10월에 제품A1을 각 대리점별로 몇개를 팔고 판매금액이 얼마인지.
2. 전체 회원들이 10월동안 구매한 각 제품은 몇개이며, 금액은 얼마인지 등등.. 

문제는 데이터량이 너무 커서 시간이 너무 오래 걸리는 것인데요.. 

저런 조건을 가진 결과 값들을 자주 봐야하고 계산해야하는데,
로딩시간은 물론이고.. 계산 시간이 너무 오래 걸립니다.
(행 하나 추가하는데 몇분,, 수식적용한 상태에서 필터 걸면 몇분 이상.. 본격적인 수식계산하면 수십분,,) 

저런 엑셀데이터가 100만행가량, 20열 이상 정도 됩니다.. (보통 엑셀통합문서로 50~100메가 수준)
데이터를 정제하는 시간, 계산하는 시간이 너무 오래 걸립니다. 

컴퓨터 속도문제이기도 하지만, 현재 성능도 나쁜편은 아니기 때문에 최신형 PC로 구매해서 해결할 수 있는 문제가 아닌 것 같아서 다른 좋은 해결 방법이 없을지 문의 드립니다. 

검색해보기로는 데이터 베이스 전문프로그램을 쓰던가 (엑서스, SQL), 컴퓨터를 병렬로 연결해서 연산속도를 높여서 사용하라는 것까지는 검색이 되네요,,

이 부분들에 대한해 개인이 쉽게 활용할 수 있는 지와 실제로 결과 값을 계산하는 속도가 많이 빨라지는 지도 궁금하구요..
참고로,, 저는 데이터를 새로 업데이트하는 일은 없고 존재하고 있는 데이터만으로 계산하는 작업을 자주 합니다.



[답변]

안녕하세요. IT전문 컨설턴트입니다. 

많은 양의 데이터를 Excel파일로 관리하는데는 문제점이 많습니다.. 이런 이유에서 엑셀과 같은 스프레드시트 기법이 아니라 SQL, 엑세스 등과 같은 DB기법을 사용할 것을 추천드립니다. 

문제는 아무리 좋은 프로그램과 기술이 있다고 하더라도 사용하는 사람이 불편함을 느낀다면 필요가 없다는 점입니다. DBMS시스템을 도입하고, DB화를 시킨다고 하더라도 DB는 DB일뿐, 현재 필요로 하는 대리점별 판매금액을 추린다거나, 회원들이 구매한 제품에 대한 통계를 낸다거나 하는 부분은 해결이 되지 않습니다. 

100만행 가량의 Excel파일이 만약 문제가 발생해서 사용할수 없게 된다면 회사입장에서는 치명적인 영향을 줄수도 있을듯 합니다. 더군다나 50M이상의 Excel파일이 열리기를 기다리는 경험을 해본 사람만이 알수 있습니다...^^; 앞으로 회사의 사업이 더 커지고, 회원수가 늘어난다면 100만행이 아니라 엄청난 수의 행이 늘어나야 할수도 있습니다. 그때는 그 시간이 더 커지겠죠. 

단순한 DBMS도입이 아니라 DBMS를 활용한 시스템 개발이 급선무인듯 합니다.참고로 100만행의 DB에 데이터를 추가하는데 1초 미만, 조건검색을 하는데 5초미만, 통계자료를 추출하는데 20초 미만의 시간이 걸릴듯 합니다.. ^^ 물론 제대로 만들었다면 이라는 단서가 붙겠죠. 

원천적인 해결을 위해서는
1. DBMS도입을 통한 DB화 전략
2. 부서별 사용자에 대한 접근성 강화: web기반의 영업지원 시스템을 개발하여 업무 프로세스를 개선시킬수 있습니다. 뿐만아니라 인증기법을 통하여 지정된 권한을 가진 직원만 사용하도록 할수도 있고, 사용기록에 대한 Log를 남기는 방법으로 보안사고에 대한 위험을 줄일수도 있습니다.
3. 통계 및 집계를 위한 DB정규화
: 위에서 예를든 2가지 통계데이터가 아니라 회사업무상에 필요한 통계자료를 분석하여 조건검색이 가능하도록 구현함으로써, 단순 작업의 시간을 감소시킬수 있습니다.
4. 자동백업을 통한 자료 관리
: DBMS에서 제공되는 스케줄러를 통하여 자동백업을 진행함으로써 중요한 자료에 유실 위험을 줄일수 있습니다.
5. 기존시스템과의 연계
: 현재 회사에서 사용하고있는 홈페이지 및 시스템과 연계하여 고객서비스 향상을 준비할수 있습니다. 

기타 자세한 부분은 전문적인 컨설팅를 통해서 진행하실것을 추천드립니다.



Posted by ToTb
2008. 9. 11. 02:28
※ ANSI 기준:DB2,INFROMIX,INGRES,ORACLE,SQL/DS,SYBASE 등 각 DBMS별로 약간의 서식 차이가 있을 수 있습니다..

ALTER DATABASE database_name
:데이터베이스를 수정(한 번도 사용해본 적 없습니다.)

ALTER TABLE table_name
    (various options)
:테이블 구조를 수정
e.g. alert table authors add birth_date datetime null

BEGIN TRANsaction [transaction_name]
:사용자정의 트랜젝션의 시작.
COMMIT TRANsaction
:사용자정의 트랜젝션의 끝

CREATE DATABASE database_name
:데이터베이스 생성

CREATE [UNIQUE] [CLUSTERED |
    NONCLUSTERED] INDEX index_name
    ON table_name
    (column_name [, column_name]...)
:인덱스 생성

CREATE TABLE table_name
    (column_name datatype [NOT NULL | NULL]
    [, column_name datatype [NOT NULL | NULL]]...)
:테이블 생성

CREATE VIEW [owner.]view_name
    [(column_name [, column_name]...)]
    AS select_statement
    [WITH CHECK OPTION]
:뷰테이블 생성

DELETE FROM
    {table_name | view_name}
    [WHERE search_conditions]
:데이터 삭제

DROP DATABASE database_name
:데이터베이스 삭제

DROP INDEX
    table_name.index_name [, table_name.index_name]...
:인덱스 삭제

DROP TABLE table_name
:테이블 삭제

DROP VIEW [owner.]view_name [, [owner.]view_name]...
:뷰테이블 삭제

DUMP DATABASE database_name
    TO device_name
:데이터베이스 자료 비우기

DUMP
TRANsaction database_name
    TO device_name
:트렌젝션 자료 비우기

GRANT {ALL | privilege_list}
    ON {table_name [(column_list)} |
        view_name [(column_list)]
    TO {PUBLIC | name_list}

GRANT {ALL | command_list}
    TO {PUBLIC | name_list}

INSERT [INTO]
    {table_name | view_name}
        [(column_list)]
    {VALUES (constant_expression
        [, constant_expression]...) | select_statement}
:데이터 추가

LOAD DATABASE database_name
    FROM device_name
:데이터베이스 읽어오기

LOAD TRANsaction database_name
    FROM device_name
:트렌젝션 읽어오기

REVOKE {ALL | privilege_list}
    ON {table_name [(column_list)] |
        view_name [(column_list)]}
    FROM {PUBLIC | name_list}

REVOKE {ALL | command_list}
    FROM {PUBLIC | name_list}

ROLLBACK TRANsaction
    [transaction_name | savepoint_name]

SAVE TRANsaction [savepoint_name]

SELECT [DISTINCT] select_list
    [INTO table_name]
    [FROM
    {table_name | view_name},
        [{table_name | view_name}]...
    [WHERE search_conditions]
    [GROUP BY [ALL] column_name
            [, column_name]...
        [HAVING search_donditions]
    [ORDER BY
        [{table_name. | view_name.}]
            column_name |
        select_list_number | expression} [ASC | DESC]
        [, {[table_name. | view_name.}]
            column_name |
        select_list_number | expression} [ASC | DESC]]...]
:데이터 가져오기

UPDATE {table_name | view_name}
SET [{table_name. | view_name.}]
column_name1 = {expression1 | NULL | (select_statement)}
[, column_name2 = {expression2 | NULL | (select_statement)}]...
    [FROM {table_name | view_name}
        [, {table_name | view_name}]...
    [WHERE search_conditions]
:데이터 수정

UPDATE STATISTICS
    table_name [index_name]


Posted by ToTb