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
운영게시판
최근게시물
MySQL Q&A 29834 게시물 읽기
No. 29834
REGEXP, REPLACE를 사용한 UPDATE시 처리 시간? (140만 레코드)
작성자
이영훈
작성일
2010-11-04 13:20ⓒ
2010-11-04 13:22ⓜ
조회수
8,325

제품 테이블에 약 140만개 정도의 레코드가 있습니다.

제품의 약어를 풀네임으로 고치려고 아래의 쿼리를 쓰려고 합니다. 이런 쿼리를 약 300개 실행해야 하는데 시간이 엄청 걸리는군요.

 

update products set fullpartname = replace(fullpartname, 'A/C', 'AIR CONDITIONER') where fullpartname REGEXP '[[:<:]]A/C[[:>:]]';

 

지금 300개의 쿼리를 넣고 돌리고 있는데, 어떤 쿼리는 수십 초, 어떤 쿼리는 수 분이 걸리기도 하네요.

지금 60%쯤 진행하는데 약 2시간째 mysql이 돌아가고 있습니다.

 

위 쿼리가 문제인가요? 아니면 이 정도의 양에서 이 정도의 처리 시간이면 정상인가요?

아니면 뭔가 시간을 단축할 만한 좋은 대안이 있을까요?

고수님들의 조언 부탁드립니다.

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

일단 fullpartname 열이 VARCHAR형인 것으로 가정하고 말씀드립니다.

VARCHAR형의 열에서 주어진 예시와 같이, 값이 길어져 갱신되는 경우에는 해당 행을 재사용할 수 없고, 사용 가능한 다음 행을 찾아 추가해야 합니다. 이 과정을 140만 x 300번 수행하는 것은 매우 긴 시간이 요구되리라 생각됩니다.

 

따라서, 저는 다음과 같은 방법을 추천해 드립니다.

(1) 소스 DB외에 대상 DB를 준비합니다. 물리적으로 다른 서버이거나, 물리적으로 다른 디스크에 존재하면 좋겠습니다.

(2) 스크립트 언어를 통해, n개의 행을 읽어옵니다.

(3) n개 행에 대해 300가지 변환 작업(REPLACE)을 적용합니다.

(4) 작업이 끝난 n개의 행을 대상 DB에 보관합니다.

(5) 140만개에 대해 2~4의 작업을 반복합니다.

 

시간을 단축하기 위해, 2~4의 작업을 위한 스크립트를 여러 대의 서버로 분산 처리합니다. 10만 단위로 쪼개어 십여개 정도의 서버가 분할 처리한다면 비교적 빠른 시간 내에 처리할 수 있겠습니다.

박현우(lqez)님이 2010-11-08 05:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29837. [1]
변재언
2010-11-08
9704
29836mysqldump로 dump할 때 몇개의 데이터에서 ' 가 생략되어서 문제입니다.
BlueSpy
2010-11-08
7946
29835테이블 하나 생성하려고 하는데 안되네요. ERROR 1005 [1]
SQL초보
2010-11-08
9078
29834REGEXP, REPLACE를 사용한 UPDATE시 처리 시간? (140만 레코드) [1]
이영훈
2010-11-04
8325
29832이 오류는 어떤건가요? [4]
BlueSpy
2010-11-02
8689
29831innodb ibdata 쓰기 관련 [1]
박신득
2010-10-27
8101
29830. [5]
변재언
2010-10-27
9865
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다