Background Image
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

1. 요구사항 예시


CUBRID의 초기 설치 데이터베이스인 demodb participant테이블에 rank칼럼을 추가하여 개최 년도 별 국가의 순위를 일괄 update하는 문을 작성하시오.


AS-IS

host_year

nation_code

gold

silver

bronze

rank

2004

USA

36

39

27

(NULL)

2004

CHN

32

17

14

(NULL)

2004

RUS

27

27

38

(NULL)

2004

AUS

17

16

16

(NULL)

2004

JPN

16

9

12

(NULL)


TO-BE

host_year

nation_code

gold

silver

bronze

rank

2004

USA

36

39

27

1

2004

CHN

32

17

14

2

2004

RUS

27

27

38

3

2004

AUS

17

16

16

4

2004

JPN

16

9

12

5


2. 칼럼 추가


1
2
ALTER TABLE participant 
ADD COLUMN RANK INTEGER;
cs


3. AS-IS SQL


실제 업무에서 아래와 같이 구현된 SQL로 인해 성능부하가 일어남(테이블 X_LOCK 회피 불가)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
UPDATE participant a
SET a.rank = (
                    SELECT c.rank
                    FROM 
                    (                
                        SELECT 
                        b.host_year, b.nation_code,
                        RANK() OVER(PARTITION BY HOST_YEAR ORDER BY GOLD DESC, SILVER DESC, bronze DESC) rank
                    FROM participant b
                    ) c
                    WHERE c.host_year = a.host_year 
                    AND c.nation_code = a.nation_code
                    )
WHERE EXISTS (
                        SELECT '1'
                        FROM 
                        (
                            SELECT 
                                d.host_year, d.nation_code
                            FROM participant     d
                        ) e
                        WHERE a.host_year = e.host_year
                        AND a.nation_code = e.nation_code
                    );
 
cs


1.jpg


-실행계획 설명

participant 테이블을 3번이나 full scan하였음 -> i/o 증가, 비효율

update시에 participant테이블이 full scan되었으로 테이블 전체 X_LOCK이 걸림 -> 동시성 저하


4. TO-BE SQL


4.1 UPDATE 조인문 활용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE 
participant a, 
(
SELECT
            b.host_year,
            b.nation_code,
            RANK() OVER(PARTITION BY HOST_YEAR ORDER BY GOLD DESC, SILVER DESC, bronze DESC) RANK
        FROM
            participant b
 
) b
SET a.rank = b.rank
WHERE a.host_year = b.host_year
AND a.nation_code = b.nation_code
;
cs


2.jpg


-실행계획 설명

participant 테이블을 1번만 full Scan하였음

update participant 테이블이 index scan되었으로 성능향상

SQL에 대한 가독성이 향상되어 유지보수에 용이함


4.2 MERGE INTO문 활용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MERGE
INTO
    participant A
USING
    (
        SELECT
            b.host_year,
            b.nation_code,
            RANK() OVER(PARTITION BY HOST_YEAR ORDER BY GOLD DESC, SILVER DESC, bronze DESC) RANK
        FROM
            participant b
    ) B ON (
        A.HOST_YEAR = B.HOST_YEAR
        AND A.NATION_CODE = B.NATION_CODE
    )
    WHEN MATCHED THEN
        UPDATE
        SET
            A.RANK = B.RANK;
 
cs


3.jpg


-실행계획 설명

participant 테이블을 1번만 full Scan하였음

update participant 테이블이 index scan되었으로 성능향상

SQL에 대한 가독성이 향상되어 유지보수에 용이함


4.1방식과 4.2방식 모두 사용 가능함


5. 결론


전체를 UPDATE하는 질의문은 테이블 X_LOCK이 잡히지 않도록 SELECT대상 집합을 기준으로 하여 INDEX SCAN을 통한 업데이트를 해야 한다.







TAG •

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
239 질의작성 컬럼 사이즈 변경 방법 정만영 2009.03.14 24334
238 CUBRID 매니저 CUBRID Manager Client 에러(Java관련). file 윤희서 2009.02.06 24152
237 질의작성 데이터 값 작은 따옴표(') 넣기 정만영 2009.03.20 23810
236 운영관리 CUBRID 에서의 사용자 권한관리 방법 file cubebridge 2012.04.14 23651
235 질의작성 쿼리로 테이블이 존재하는지 확인하기 시난 2009.12.28 23521
234 질의작성 pivot() 간략하게 구현하기 남재우 2009.06.24 23426
233 CUBRID 매니저 데이터베이스 자동시작 설정(CUBRID 7.3.0). 윤희서 2009.01.17 23155
232 마이그레이션 MySQL+XE를 CUBRID+XE로 운영하기 – mysqldump파일과 CMT사용 file cubebridge 2012.11.13 23071
231 운영관리 64비트 윈도우환경에서 32비트 ODBC 사용하기 Prototype 2009.12.09 22676
230 마이그레이션 MySQL에서 CUBRID로 갈아탈 때 알아야 할 것 cubebridge 2012.11.13 22616
229 질의작성 임의의 컬럼을 rownum 으로 업데이트 하기 Prototype 2009.07.01 22532
228 CUBRID 매니저 큐브리드 매니저 "선택한 JDBC 드라이버는 CUBRID를 지원하지 않습니다." 해결방법 file 정만영 2010.01.29 22516
227 응용개발 윈도우 환경에서 PHP 모듈 로드를 못 할 경우 해결법 3 Prototype 2009.11.26 22484
226 기타 cubrid: error while loading shared libraries 에러가 발생했을 경우 대처 웁쓰 2009.05.19 22437
225 운영관리 HP-ux에서 jvm loading이 실패하는 경우 조치 사항 admin 2008.11.21 22432
224 응용개발 CUBRID에서 euc-kr의 한글 데이터를 utf-8의 한글 데이터로 변경 시 주의할 점 cubebridge 2010.04.01 22403
223 질의작성 문자 코드셋(UTF-8, EUC-KR) 사용시 CUBRID 는? 남재우 2010.01.01 22398
222 질의작성 테이블 데이터 복사 하기 정만영 2009.03.14 22301
221 운영관리 백업파일을 이용하여 데이터베이스가 없는 다른 서버에서 복구하는 방법 admin 2008.11.21 22044
220 마이그레이션 타 DB 에서 마이그레이션시 질의 변경 샘플 - CASE 문 웁쓰 2009.12.31 21924
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 14 Next
/ 14

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales