SQL에는 두 가지 유형의 VIEW가 있습니다:
일반 VIEW는 복잡성을 추상화하고 접근성을 간소화하며 여러 소스의 데이터를 집계하는 데 유용합니다. 항상 즉시 생성되기 때문에 쿼리를 가속화하지 않습니다.
물리적 VIEW는 복잡한 보고서와 분석에서 성능 이점을 제공하여, 매번 집계 및 조인 대기를 피할 수 있습니다. 데이터가 오래되지 않도록 수동으로 또는 예약에 따라 최신 상태로 유지해야 합니다.
CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';
CREATE MATERIALIZED VIEW active_users_agg AS SELECT country, COUNT(*) as cnt FROM users WHERE status = 'active' GROUP BY country; -- 업데이트를 위해: REFRESH MATERIALIZED VIEW active_users_agg;
VIEW에서 데이터를 업데이트할 수 있는가요? 그리고 VIEW의 유형에 따라 어떻게 달라지나요?
VIEW가 테이블과 업데이트 가능성이 완전히 동일하다고 종종 잘못 생각합니다. 실제로:
REFRESH를 통해서만 가능합니다. 그렇지 않으면 데이터 불일치가 발생합니다.이야기 1
BI 보고서는 여러 개의 JOIN과 집계를 포함한 일반 VIEW를 통해 작성되었습니다. 부하가 증가한 후 보고서 작성 시간이 수십 분으로 증가했습니다. 시스템 분석가는 물리적 VIEW를 제안했으며, 이는 데이터를 별도의 테이블에 저장하게 되어 즉시 시간을 몇 초로 단축시켰습니다.
이야기 2
개발자는 Oracle로 마이그레이션 시 일반 VIEW를 통해 UPDATE를 시도했으며, "view with group by is not updatable"라는 오류가 발생했습니다. 그 이유는 VIEW에서 GROUP BY를 사용했기 때문입니다.
이야기 3
한 회사에서는 새 데이터를 가져온 후 물리적 VIEW를 업데이트하는 것을 잊어버려, 다양한 사용자 간의 보고서 불일치가 발생했습니다. 분석이 이 VIEW의 오래된 데이터를 사용하였기 때문입니다. 이후 예약에 따라 자동 REFRESH를 추가했습니다.