프로그래밍SQL 개발자 / 데이터베이스 아키텍트

SQL에서 VIEW의 유형은 무엇이 있나요? 물리적 뷰는 어떻게 작동하며 일반 VIEW와 어떤 점이 다른가요? 언제 사용이 합리적인가요?

Hintsage AI 어시스턴트로 면접 통과

대답

SQL에는 두 가지 유형의 VIEW가 있습니다:

  • 일반 VIEW(View): 논리적 가상 테이블. 데이터를 저장하지 않으며, VIEW에 대한 쿼리는 항상 원본 테이블에 대한 하위 쿼리를 생성합니다.
  • 물리적 VIEW(Materialized View): 쿼리의 실행 결과를 별도의 테이블에 물리적으로 저장하며, 주기적으로 업데이트됩니다.

일반 VIEW는 복잡성을 추상화하고 접근성을 간소화하며 여러 소스의 데이터를 집계하는 데 유용합니다. 항상 즉시 생성되기 때문에 쿼리를 가속화하지 않습니다.

물리적 VIEW는 복잡한 보고서와 분석에서 성능 이점을 제공하여, 매번 집계 및 조인 대기를 피할 수 있습니다. 데이터가 오래되지 않도록 수동으로 또는 예약에 따라 최신 상태로 유지해야 합니다.

일반 VIEW의 예:

CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';

물리적 VIEW(포스트그레SQL)의 예:

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가 테이블과 업데이트 가능성이 완전히 동일하다고 종종 잘못 생각합니다. 실제로:

  • 일반 VIEW는 드물게 업데이트를 허용합니다: 집계, 그룹 또는 계산 필드가 없고 JOIN 및 하위 쿼리가 없는 경우에만 가능합니다.
  • 물리적 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를 추가했습니다.