일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 운영체제
- 자바 프로젝트
- MongoDB
- 리눅스
- JVM
- gradle
- auto configure
- 프로젝트
- spring
- 오라클
- c#
- 문법 정리
- resilience4j
- 자바
- 유사코드
- 알고리즘
- 티스토리
- 오라클 디비
- oracle
- SQL
- hyperledger
- jsp
- smart cast
- K6
- 백준 알고리즘
- dynamic query
- 초대장
- 학점
- 파이썬 소스
- 파이썬
Archives
- Today
- Total
모종닷컴
VIEW 알고리즘 이해하기 - MERGE 편 본문
반응형
뷰 테이블이 있는데 되게 느려져서 좀 찾아보다가 알게된 부분들이 있어 글로 정리하려고 합니다.
알고리즘
MySQL에서 뷰를 처리할 때 알고리즘의 종류는 아래와 같다.
- MERGE : MERGE를 사용하면 뷰 정의와 뷰를 참조하는 명령문의 관련 부분이 병합됩니다
- TEMPTABLE : TEMPTABLE을 선택하면 뷰 결과가 임시 테이블에 저장됩니다.
- UNDEFINED : MySQL이 사용할 알고리즘을 정합니다. 기본 알고리즘은 optimizer_switch 시스템 변수의 derived_merge 플래그 값에 결정됩니다. UNDEFINED 뷰 알고리즘은 아래와 같은 상황에 지정됩니다.
- CREATE VIEW 에 알고리즘을 지정하지 않았을 때
- CREATE VIEW 문에 명시적으로 ALGORGERM = UNDEFINED를 써놨을 때
- ALGORITHM = MERGE는 임시 테이블로만 처리할 수 있는 뷰에 대해서만 가능하기에 이 경우 MySQL이 경고를 생성하고 알고리즘을 UNDEFINED로 세팅
TEMPTABLE을 명시적으로 지정하는 이유는 임시 테이블이 생성된 후 구문 처리를 완료하기 전에 기본 테이블에서 잠금을 해제할 수 있기 때문입니다. 이로 인해 MERGE 알고리즘보다 잠금 해제가 더 빨라져서 뷰를 사용하는 다른 클라이언트가 오랫동안 차단되지 않을 수 있습니다.
MERGE 이해하기
앞서 언급했듯이 MERGE는 뷰 정의의 해당 부분을 참조하는 문으로 병합하여 처리됩니다. 다음 예제에서는 MERGE 알고리즘의 작동 방식을 간략히 설명합니다. 이 예제에서는 v_merge 뷰가 다음과 같이 정의된다고 가정합니다.
예제 1)
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;
아래 구문을 실행한다고 가정합니다.
SELECT * FROM v_merge;
MySQL은 이 구문을 다음과 같이 처리합니다.
- v_merge는 t로 치환됩니다.
- 에스터리스크(*)는 vc1, vc2가 되고 c1, c2로 일치시킵니다
- 구문에 WHERE 절이 추가됩니다.
실제 실행되는 구문은 다음과 같습니다.
SELECT c1, c2 FROM t WHERE c3 > 100;
예 2)
실행하려는 구문은 다음과 같습니다.
SELECT * FROM v_merge WHERE vc1 < 100;
vc1 < 100이 c1 < 100이 되고 뷰 WHERE 절이 AND 연결을 사용하여 WHERE 절에 추가됩니다.
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
MERGE 알고리즘을 사용할 수 없는 경우 임시 테이블을 사용해야 합니다.
참조
https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html
반응형
'Programming > 데이터베이스' 카테고리의 다른 글
[MongoDB] Replication (1) | 2022.10.18 |
---|---|
VIEW 알고리즘 이해하기 - TEMPTABLE 편 (0) | 2022.08.13 |
MongoDB 시간 관련 쿼리 주의할 점 (0) | 2022.08.09 |
MySQL InnoDB 스토리지 엔진 (2) (0) | 2022.08.08 |
MySQL InnoDB 스토리지 엔진 (1) (0) | 2022.07.30 |