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
운영게시판
최근게시물
MS-SQL Q&A 6662 게시물 읽기
No. 6662
테이블 복제에 대해 질문드려요
작성자
whiteboy(don12345)
작성일
2013-05-03 20:08
조회수
8,487

 

 

안녕하세요.

 

테이블 복제에 대해서 문의 드립니다.

 

필드가 같고 모든 조건이 같은

 

테이블 test1과 test2가 각각 있습니다.

 

필드는.. 

 

user_id, point, createdate

 

이구요..

 

일단 test1에만 point값이 변화가 생기는데요..

 

이것을 일정시간마다 test1의 모든 내용을 test2로 복제하고

 

test1의 point 내용은 초기화를 시킬려고 합니다.

 

그래서..

 

truncate table test2

insert into test2 select * from test1

update test1 set point=0

 

이런식으로 하니깐 잘 되더군요..

 

그런데 문제점이 100만건정도를 테스트하니 30-40초정도로 시간이 꽤 걸리는데요..

 

이런방법 말고 시간을 줄여줄수 있는 다른방법이 없을까요?

 

조언 좀 부탁드립니다. ^^

 

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

 -- table1과 table2에 공통되는 userId와 createdate를 공통 테이블 bt로 두고 필요에 따라 join에 사용할 rowId 추가

-- point 부분을 기존의 table1은 logT로 table2는 backT로 하여 SP_RENAME을 사용
 
 
-- 테스트 환경 구축
 
-- 공통 테이블 bt 백만건 생성
IF OBJECT_ID('bt') IS NOT NULL
DROP TABLE bt;
GO
SELECT TOP(1000000)
ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL ) ) AS rowId
, ABS(CHECKSUM(NEWID())) AS userId
, DATEADD(SECOND, ABS(CHECKSUM(NEWID())), '1980-05-18') AS createdate
INTO bt
FROM sys.all_columns AS aa CROSS JOIN sys.all_columns AS bb
;
-- 나중에 MAX(rowId)를 쉽게 찾기 위해 index 생성하긴 하지만 없어도 뭐...
CREATE NONCLUSTERED INDEX x_bt_rowid ON bt(rowId)
;
 
-- bt에 있는 행 수(=백만)만큼 테스트 데이터 생성
IF OBJECT_ID('logT') IS NOT NULL
DROP TABLE logT;
GO
SELECT rowId, ABS(CHECKSUM(NEWID())) AS point INTO logT FROM bt;
GO
-- backT를 대충 생성
IF OBJECT_ID('backT') IS NOT NULL
DROP TABLE backT;
GO
SELECT rowId, point INTO backT FROM logT;
GO
 
-- 시작 시간 측정
IF OBJECT_ID('tempdb..#diffTime') IS NOT NULL
DROP TABLE #diffTime;
GO
CREATE TABLE #diffTime( dt DATETIME2 );
INSERT INTO #diffTime( dt ) SELECT GETDATE();
 
 
-- backT를 날리고 / logT를 backT로 변경 / bt에서 삭제된 rowId도 포함될 수 있어서 정확히는 아니지만 logT 빠르게 생성
DROP TABLE backT;
GO
SP_RENAME @objname = 'logT' , @newname = 'backT'
;
SELECT TOP( SELECT MAX( rowId ) FROM bt )
ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL ) ) AS rowId, 0 AS point
INTO logT
FROM sys.all_columns AS aa 
CROSS JOIN sys.all_columns AS bb
CROSS JOIN sys.all_columns AS cc
;
 
 
-- 종료 시각 측정
INSERT INTO #diffTime( dt ) SELECT GETDATE();
 
 
-- 수행 시간 확인
SELECT DATEDIFF( ms, MIN(dt), MAX(dt) ) FROM #diffTime;
 
우욱님이 2013-05-04 04:40에 작성한 댓글입니다. Edit

우욱님 상세한 답변 감사드립니다. 많은 도움이 되었습니다. ^^
그런데 인덱스 관련해서 한가지 개인적으로 따로 궁금한 부분이 있는데
메일 주소 좀 알수있을까요?

whiteboy(don12345)님이 2013-05-04 18:41에 작성한 댓글입니다.

  uook.com 에서 click to see E-mail 부분을 클릭하시면 메일 주소를 보실 수 있습니다 

우욱님이 2013-05-06 08:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6667REPLACE VALUE [5]
ohyouknow
2013-05-13
7957
6665SQL join [4]
ohyouknow
2013-05-10
8619
6664MS SQL 교육 문의 [1]
namkyu
2013-05-09
8218
6662테이블 복제에 대해 질문드려요 [3]
whiteboy
2013-05-03
8487
6661로그테이블에 인덱스를 걸어야하나요? [3]
whiteboy
2013-04-29
9140
6660기본적인 LOCK 정책 변경하는 방법. [1]
이대규
2013-04-29
8172
6659완전 초보적인 질문 하나만 하겠습니다. [1]
김녹연
2013-04-25
7706
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다