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 질의작성 입력된 년월 또는 두개의 날짜을 이용하여 달력 및 주차 구하기 1 성진 2016.08.10 5576
238 질의작성 입력된 날자를 이용하여 해당 주차의 모든 날자 구하기 성진 2018.04.10 1108
237 질의작성 임의의 컬럼을 rownum 으로 업데이트 하기 Prototype 2009.07.01 22532
236 질의작성 일정 범위 임의의 정수 생성 방법(random 함수 응용) 손승일 2015.12.22 6472
235 응용개발 응용프로그램에서 질의 처리시 commit/rollback 처리 문제 admin 2008.11.21 21599
234 응용개발 윈도우 환경에서 PHP 모듈 로드를 못 할 경우 해결법 3 Prototype 2009.11.26 22484
233 운영관리 윈도우 OS에서 java sp 사용 시 Java VM is not running 해결 방법 정훈 2017.09.04 2229
232 CUBRID 매니저 워크스페이스 사용중입니다. 다른 워크스페이스를 선택하세요. 대응법 성진 2015.04.24 10507
231 응용개발 용량이 큰 데이터를 질의로 저장하는 방법 남재우 2009.11.26 12117
230 질의작성 요일 값을 반환 받을 수 있는 질의 형태 정만영 2009.03.13 17107
229 질의작성 오류데이타검증 - 숫자 이외의 데이타 확인하는 방법 권호일 2013.01.17 21121
228 마이그레이션 오라클의 order by 시 first와 last 대체 사용법 file cubebridge 2012.11.12 20576
227 질의작성 오라클의 order by 시 first와 last 대체 사용법 file 이용미 2011.12.22 20177
226 질의작성 오라클의 DBMS_RANDOM.STRING() 함수를 CUBRID 식으로 구현하는 방법 이경오 2015.12.08 7973
225 질의작성 오라클 바이딩 변수와 큐브리드 인터프리터 변수를 사용한 경로 표현식 정만영 2009.06.09 13483
224 응용개발 오라클 to CUBRID로 마이그레이션 수행 시 주의사항 cubebridge 2012.11.12 16642
223 마이그레이션 오라클 to CUBRID로 마이그레이션 수행 시 주의사항 정만영 2012.03.02 21057
222 질의작성 예제를 이용한 중복데이터 삭제 janus 2009.12.02 18541
221 질의작성 예약어를 테이블명이나 컬럼명으로 사용시 admin 2008.11.21 37421
220 질의작성 여러건의 코드명을 한건으로 조회하는 쿼리입니다. 1 권호일 2012.03.30 10755
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