20.5.2 View Processing 알고리즘
CREATE VIEW
또는 ALTER VIEW
옵션 ALGORITHM
절은 표준 SQL에 대한 MySQL 확장입니다. 이것은 MySQL에 의한 뷰의 처리 방법에 영향을 미칩니다. ALGORITHM
은 MERGE
, TEMPTABLE
또는 UNDEFINED
의 3 개의 값을받습니다. ALGORITHM
절이 없으면 기본 알고리즘은 UNDEFINED
입니다.
MERGE
의 경우 뷰를 참조하는 명령문 텍스트와 뷰 정의가 병합 된 뷰 정의 부분이 해당 문 부분을 대체합니다.
TEMPTABLE
의 경우 뷰의 결과를 임시 테이블에 가져온 다음 문을 실행하는 데 사용됩니다.
UNDEFINED
의 경우, MySQL은 사용할 알고리즘을 선택합니다. 가능한 한 TEMPTABLE
보다 MERGE
가 우선됩니다. 이것은 일반적으로 MERGE
쪽이 효율성이 높고, 임시 테이블을 사용하면 뷰를 업데이트 할 수 없기 때문입니다.
명시 적으로 TEMPTABLE
를 선택하는 이유는 임시 테이블이 작성된 후에, 문 처리를 완료하는 데 사용되기 전에 기본이되는 테이블에 잠금을 해제 할 수 있기 때문입니다. 그 결과, MERGE
알고리즘보다 신속하게 잠금이 해제 된 뷰를 사용하는 다른 클라이언트가 장시간 차단 될 수 없습니다.
다음의 3 가지 이유로 인해 뷰 알고리즘을 UNDEFINED
수 있습니다.
CREATE VIEW
문 안에ALGORITHM
절이 존재하지 않는다.CREATE VIEW
문에 명시적인ALGORITHM = UNDEFINED
절이있다.임시 테이블에서만 처리 할 수없는 뷰에 대해
ALGORITHM = MERGE
이 지정되어있다. 이 경우, MySQL은 경고를 보내고 알고리즘을UNDEFINED
으로 설정합니다.
앞서 언급했듯이, MERGE
는 뷰 정의의 해당 부분을 뷰를 참조하는 명령문에 병합 처리됩니다. 다음 예제에서는 MERGE
알고리즘의 동작에 대해 간략하게 설명합니다. 예를 들어, 다음의 정의를 포함하는 뷰 v_merge
가 존재하고 있다고 가정합니다.
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS SELECT c1, c2 FROM t WHERE c3 > 100;
예제 1 : 다음 명령문을 발행합니다.
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
이되고, AND
연결을 사용하여 뷰 WHERE
절이 문 WHERE
절에 추가되는 점이 다릅니다 (또한 어구의 일부가 올바른 우선 순위로 실행되도록 괄호가 추가됩니다). 결과가 실행되는 문은 다음과 같이됩니다.
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
사실상 실행되는 명령문은 다음과 같은 형식의 WHERE
절이 포함되어 있습니다.
WHERE (select WHERE) AND (view WHERE)
MERGE
알고리즘을 사용할 수없는 경우 임시 테이블을 대신 사용해야합니다. 보기에 다음 중 하나의 구조 구문이 포함 된 경우 MERGE
는 사용할 수 없습니다.
집계 함수 (
SUM()
,MIN()
,MAX()
,COUNT()
등)DISTINCT
GROUP BY
HAVING
LIMIT
UNION
또는UNION ALL
선택 목록의 서브 쿼리
리터럴 값만을 참조 (이 경우 기본이되는 테이블이 없습니다)