Loading...
MySQL 9.5 Reference Manual 9.5의 27.6.2 View Processing Algorithms의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
CREATE VIEW 또는 ALTER VIEW에 대한 선택적 ALGORITHM 절은 표준 SQL에 대한 MySQL 확장입니다. 이는 MySQL이 view를 처리하는 방식에 영향을 줍니다. ALGORITHM은 다음 세 값을 가집니다: MERGE, TEMPTABLE, 또는 UNDEFINED.
MERGE의 경우, view를 참조하는 statement와 view 정의의 텍스트가 병합되어, view 정의의 일부가 statement의 해당 부분을 대체합니다.
TEMPTABLE의 경우, view로부터의 결과가 임시 테이블로 가져와지고, 그 임시 테이블을 사용하여 statement를 실행합니다.
UNDEFINED의 경우, MySQL이 사용할 알고리즘을 선택합니다. 가능하다면 TEMPTABLE보다 MERGE를 선호하는데, MERGE가 보통 더 효율적이고 임시 테이블이 사용될 경우 view는 업데이트할 수 없기 때문입니다.
ALGORITHM 절이 존재하지 않으면, 기본 알고리즘은 optimizer_switch 시스템 변수의 [derived_merge] 플래그 값에 의해 결정됩니다. 추가적인 논의는 [Section 10.2.2.4, “Optimizing Derived Tables, View References, and Common Table Expressions with Merging or Materialization”]을 참조하십시오.
TEMPTABLE을 명시적으로 지정할 한 가지 이유는, 임시 테이블이 생성된 후 statement 처리를 완료하기 전에 기반 테이블에 대한 락을 해제할 수 있기 때문입니다. 이는 MERGE 알고리즘보다 락이 더 빨리 해제되도록 하여, view를 사용하는 다른 클라이언트들이 그만큼 오래 블록되지 않게 할 수 있습니다.
view 알고리즘이 UNDEFINED가 될 수 있는 이유는 세 가지입니다:
CREATE VIEW statement에 ALGORITHM 절이 존재하지 않을 때.
CREATE VIEW statement에 명시적인 ALGORITHM = UNDEFINED 절이 있을 때.
임시 테이블로만 처리할 수 있는 view에 대해 ALGORITHM = MERGE가 지정된 경우. 이 경우, MySQL은 경고를 생성하고 알고리즘을 UNDEFINED로 설정합니다.
앞에서 언급했듯이, MERGE는 view 정의의 해당 부분을 view를 참조하는 statement 안으로 병합하는 방식으로 처리됩니다. 아래 예제는 MERGE 알고리즘이 어떻게 동작하는지 간단히 보여줍니다. 이 예제들은 다음과 같은 정의를 가진 view v_merge가 있다고 가정합니다:
1CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS 2SELECT c1, c2 FROM t WHERE c3 > 100;
예제 1: 다음 statement를 실행한다고 가정해 보겠습니다:
1SELECT * FROM v_merge;
MySQL은 이 statement를 다음과 같이 처리합니다:
v_merge는 t가 됩니다.
*는 vc1, vc2가 되며, 이는 c1, c2에 해당합니다.
view의 WHERE 절이 추가됩니다.
실제로 실행되는 최종 statement는 다음과 같습니다:
1SELECT c1, c2 FROM t WHERE c3 > 100;
예제 2: 다음 statement를 실행한다고 가정해 보겠습니다:
1SELECT * FROM v_merge WHERE vc1 < 100;
이 statement는 앞의 예제와 비슷하게 처리되지만, vc1 < 100이 c1 < 100이 되고, view의 WHERE 절이 statement의 WHERE 절에 [AND] 연결자를 사용하여 추가됩니다(또한 절의 각 부분이 올바른 우선순위로 실행되도록 괄호가 추가됩니다). 실제로 실행되는 최종 statement는 다음과 같습니다:
1SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
결과적으로, 실행될 statement의 WHERE 절은 다음 형태를 갖습니다:
1WHERE (select WHERE) AND (view WHERE)
MERGE 알고리즘을 사용할 수 없는 경우, 대신 임시 테이블을 사용해야 합니다. 병합을 방해하는 구문들은 파생 테이블과 공통 테이블 식에서 병합을 방해하는 것들과 동일합니다. 예를 들면, 서브쿼리 안의 SELECT DISTINCT나 LIMIT 등이 있습니다. 자세한 내용은 [Section 10.2.2.4, “Optimizing Derived Tables, View References, and Common Table Expressions with Merging or Materialization”]을 참조하십시오.
27.6.1 View Syntax
27.6.3 Updatable and Insertable Views