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 5280 게시물 읽기
No. 5280
성능 향상문의좀 부탁드려여
작성자
임진표(운가라)
작성일
2009-07-21 20:25ⓒ
2009-07-22 08:57ⓜ
조회수
5,646

mem 테이블

seq

jumin

carnum

1

1

가1

2

2

가2

3

3

가3

4

4

가4

5

5

가5

6

1

가6

7

2

가2

8

3

가3

9

4

가4

10

5

가10



acct 테이블

seq

acct_no

use_yn

jumin

carnum

1

a1

n

 

 

2

a2

n

 

 

3

a3

n

 

 

4

a4

n

 

 

5

a5

n

 

 

6

a6

n

 

 

7

a7

n

 

 

8

a8

n

 

 

9

a9

n

 

 

10

a10

n

 

 



상기의 2테이블이 있습니다.

mem 테이블의 jumin 과 carnum을 그룹형으로 묶어서  고유값을 순차적으로 acct 에 업데이트 시키려고  하고있습니다.



결과테이블

seq

acct_no

use_yn

jumin

carnum

1

a1

y

1

가1

2

a2

y

2

가2

3

a3

y

3

가3

4

a4

y

4

가4

5

a5

y

5

가5

6

a6

y

1

가6

7

a7

y

5

가10

8

a8

n

 

 

9

a9

n

 

 

10

a10

n

 

 



그래서 아래와 같이 쿼리문을 작성하여 보았습니다.

DECLARE @CNT INT,
  @MINCNT INT,
  @JUMIND VARCHAR(20),
  @CARNUM VARCHAR(20)


SET NOCOUNT ON
 BEGIN

   SELECT @CNT = COUNT(JUMIN) FROM (
   SELECT JUMIN, CARNUM FROM NEM
   GROUP BY JUMIN, CARNUM ) T1
   LEFT OUTER JOIN
   ACCT T2
   ON T1.JUMIND = T2.JUMIN AND T1.CARNUM = T2.JUMIN
   WHERE T2.USE_YN IS NULL
   
  
  SET @MINCNT = 1
  SET @CNT = @MINCNT
  WHILE(@MINCNT <= @CNT)

  BEGIN
  BEGIN TRAN TT1

   SELECT  TOP 1 @JUMIN=JUMIN, @CARNUM=CARNUM   FROM (
   SELECT JUMIN, CARNUM FROM MEM
   GROUP BY JUMIND, CARNUM ) T1
   LEFT OUTER JOIN
   ACCT T2
   ON T1.JUMIN = T2.JUMIN AND T1.CARNUM = T2.CARNUM
   ORDER BY USE_YN ASC
   
    
   -- 업데이트
   UPDATE TOP (1) ACCT
   SET USE_YN ='Y' , JUMIN = @JUMIND, CARNUM= @CARNUM
   WHERE USE_YN='N'
   
  IF @@ERROR <> 0 BEGIN
   ROLLBACK TRAN TT1
   RETURN (99)
  END
  COMMIT TRAN TT1

  SET @JUMIND = NULL
  SET @CARNUM = NULL
  SET @MINCNT = @MINCNT + 1

 END



ㅡㅡ; 결과는 매우느리네여..1000건 실행하는데 6분40초..
 성능향상할 수있는 조언좀 부탁드립니다.

MEM 테이블에 JUMIN 과 CARNUM은 언제든지 데이터가 바뀔 수 있습니다.
ACCT 테이블의 한번 JUMIN과 CARNUM은 복합하여 고유값으로 매핑되어야합니다.

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

UPDATE A

SET USE_YN = 'Y'

, JUMIN = B.JUMIN

, CARNUM = B.CARNUM

FROM ACCT A

INNER JOIN (

SELECT JUMIN, CARNUM, SEQ = ROW_NUMBER() OVER (ORDER BY SEQ ASC)

FROM (SELECT JUMIN, CARNUM, SEQ = MIN(seq) FROM MEM

GROUP BY JUMIN, CARNUM) X

) B

ON A.SEQ = B.SEQ

 

 

SELECT * FROM ACCT

 

.님이 2009-07-22 16:06에 작성한 댓글입니다. Edit

답변감사드립니다. 적어주신 쿼리는 첫 실행시 매우 유용하게 쓰일듯합니다.


몇가지 체크사항이 빠져있어 글올립니다.

업데이트는 한번으로 끝나는 상태가 아니고 매일 새벽에 스케줄에 의해서 한번씩 실행됩니다.

그리고  한번 acct 테이블에(jumin,carnum 합쳐서 유니크) 매핑된 내용은 계속 사용해야 합니다.

즉 mem테이블의 jumin, carnum 값이  acct테이블에 (jumin, carnum 합쳐서 유니크) 없는 내용만 업데이트 하여야 합니다.




임진표(운가라)님이 2009-07-22 17:22에 작성한 댓글입니다.
이 댓글은 2009-07-22 17:26에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
5289카운트뽑아오는 쿼리인데, 반환 속도가 2분30초 걸립니다. (IN 질의 사용) [1]
ganjang
2009-07-27
5367
5288전문용어집 데이타베이스 구축방법을 알겠습니다. (초보)
최원식
2009-07-23
5156
5287컬럼에 수식이 들어있다면 계산을 할수 있을까요? [1]
인트레더블
2009-07-22
5457
5280성능 향상문의좀 부탁드려여 [2]
임진표
2009-07-21
5646
5279[질문]Access의 OLE객체 타입, Ms-SQL에 저장.
이기자
2009-07-21
5688
5260스키마명을 명시해줘야 하는 문제
김종화
2009-07-16
5622
5252OLE DB 문제입니다 ㅠㅠ
enteris
2009-07-14
5440
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다