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 28421 게시물 읽기
No. 28421
중소 데이타베이스 미그레이션 속도 성능 문제 질문입니다.
작성자
강동화(somaggio)
작성일
2009-05-30 03:41
조회수
5,650

안녕하세요.

현재 하나의 데이타베이스를 통합하는차에,

40여개의 테이블의 ID값 변경와 물리적으로 외래키 관계는 아니지만,

논리적으로 연관되는 테이블의 값도 변경해야하는 일을 하고 있습니다.


각 테이블당에 20여만개의 데이타가 저장되어 있구요.

일단 php배치모드로 만들어 시뮬레이션해보니, 거의 50시간이 걸릴것 같은....


예를 들어 한 테이블에 종속 된 테이블이 4개 있는 경우,

첫 메인 테이블에 임시 temp_id를 만들어 두고, 그곳에 auto_increment되는 값을 저장하기 위해서요.

첫 메인 테이블에서 select를 수행하고 temp_id에 증가된 자연수값을 입력하고,(update)

각 종속된 테이블에 외래어 키 역확을 하는 놈에 대해 또한 임시 필드를 만들에 temp_id값을 

저장하는 단순한 update를 수행하는 것을 반복합니다.


마지막에 메인테이블과 종속테이블에 관련된 필드를 제거하고,

temp_id를 id로 변경하고, 종속테이블의 임시 필드를 원래의 필드로 change 하는 단순한 과정입니다.

각 쿼리의 수행속도는 0.05초 정도인데,

실제 총 걸린 시간을 보면 머 거의 2박 3일을 꼬박 돌려아할 것 같구요.


팀장넘은 한시간내에 끝내도록 스크립터를 만들어라하는데.......

20만개의 테이타를 가진 40여개의 테이블을 어떤 수로 한시간에 작살낸단 말입니까..


혹 고수분들 중에 최적화에 도움을 주실분이 계시면,

복~ 받으실 거예요~ 

감사합니다.


참고로, 각 테이블에 사용되는 키들엔 인덱스를 걸어두었고요.

때때론 테이블에 너무 많은 인덱스가 있어, 용량이 실제 데이타의 3배인 경우도 있더군요.

클라이언트 쪽에서 인덱스를 무지 붙여두었더군요..

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

어차피 새로운 PK/FK를 새로 만드시는데 굳이 그러실 필요가 있을까요?


옮기는 대상이 되는 테이블의 새 PK에 AUTO_INCREMENT를 걸고(그럼 이동하는 순간 PK문제는 해결될듯 합니다만..)


그 값을 기준으로 종속테이블들의 새롭게 FK를 걸면 되지 않을까요?


굳이 SQL을 그렇게 여러번 수행할 필요가 있는 것 일런지요?

허성욱(RedBaron)님이 2009-05-31 04:55에 작성한 댓글입니다.

안녕하세요.
답변감사드립니다.
문제는 제 테이블들이 FK를 걸어둘 수가 없더라구요.
메인 테이블이 call, account 이고, 종속 테이블이 note인경우
note.parent_type = 'Account' => note.parent_id = account.id 이고,
note.parent_type = 'Call' => note.parent_id = call.id 인 관계가 많거든요.

간단한 절차는 아래와 같습니다.

$sub_table = array( 'note', 'task');
$sql = 'select id from call order by date_entered';
$id_result = dbGet($conn, $sql);
$next_id = 1;
while ($row = mysql_fetch_assoc($id_result)){
 $sql_update = 'update id_temp = '.$next_id;' where id='.$row['id'];
 foreach($sub_table as $sub_table){
  $sql_sub_update = "update parent_id=".$next_id." where parent_id=".$row['id']." and parent_type='call'";
  mysql_query($conn, $sql_sub_update);
 }
}

 
제가 데이테베이스에 대해 잘 모르고 있는걸까요?

그리고 PK에 auto_increment만 걸어두면 된다고 하셨는데,
종속관계가 없는 테이블도 많이 있는데요.
어떤 식으로 한꺼번에 처리가 되나요?

전 select해서 일일이 update를 시켰는데....
이 방법만 해결이 되어도 많은 시간을 벌 수 있을 것 같은데,
답변 부탁드리겠습니다.
감사합니다.

강동화(somaggio)님이 2009-05-31 08:18에 작성한 댓글입니다.

안녕하세요 박성원입니다. 

또다시 질문자의 요지를 파악을 못하는 증세가 ㅋㅋ ;;


간단히 요약하면 

"pk를 가지는 4개의 테이블과 이와 연관된 40여개의 테이블이 있는데 인덱스값을 재정의 해주고 싶다"

맞나요? ^^;;


우선 간단한 방법은 

1. 빈 데이터베이스를 생성하시고

2. 옮길 테이블의 log 테이블을 만듭니다.   (컬럼은 old_id, new_id를 포함한 다른 로그정도를 만듭니다.)
  ex.
  set @num=1;
   insert into logtable select id, @num:=@num+1 from old_table  

3. insert into new_table (pk를 제외한 필드명) values select '', pk를 제외한 필드명 from old_table
   이런식으로 하면 아마 index가 재설정되겟쬬 ^^

4. 그리고 기존의 oldTable의 인덱스를 참조하는 테이블들을 log Table의 oldid와 newid를 이용하여 update합니다. 


이러면 아마 일일이 업데이트를 한껀씩 날리는것에 비해서 매우 빠른 속도를 보장하게 될껀데요 ^^
좀 번거롭긴한 작업입니다. 




그럼 건승하시길..

박성원(darkancia)님이 2009-06-04 13:46에 작성한 댓글입니다.
이 댓글은 2009-06-04 13:48에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
28424MySQL 쿼리 질문이요~! 한테이블에서 조인? [1]
쿼리초보
2009-05-31
6904
28423아래의 질문에 이어 auto_increment 질문입니다. [1]
강동화
2009-05-31
6564
28422파일 문의 [1]
가우나라
2009-05-30
5813
28421중소 데이타베이스 미그레이션 속도 성능 문제 질문입니다. [3]
강동화
2009-05-30
5650
28415MySQL 쿼리문에 쿌 문자 앞에서 잘려 들어갑니다. [1]
강요찬
2009-05-28
5289
28261mysql 쿼리 질문 [1]
조항철
2009-05-25
5829
28231인덱스 문의 [1]
새벽소리
2009-05-22
5180
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다