SQL Server에서 구체화 된 뷰를 생성하는 방법은 무엇입니까?


101

DW를 디자인하려고하는데 구체화 된 뷰에 대해 들었습니다. 실제로보기를 만들고 싶습니다. 기본 테이블이 변경되면 자동으로 업데이트됩니다. 누구든지 쿼리 예제로 설명 할 수 있습니다 ..

답변:


144

SQL Server 에서는 인덱싱 된 뷰 라고 합니다. 자세한 배경 정보는 다음 백서를 읽으십시오.

기본적으로해야 할 일은 다음과 같습니다.

  • 일반보기 만들기
  • 해당 뷰에 클러스터형 인덱스를 만듭니다.

그리고 당신은 끝났습니다!

까다로운 부분은보기가 많은 제약과 제한을 충족해야한다는 것입니다. 이러한 제한은 백서에 설명되어 있습니다. 이렇게하면-그게 전부입니다. 보기는 자동으로 업데이트되며 유지 관리가 필요하지 않습니다.

추가 리소스 :


답장을 보내 주셔서 감사합니다. 나는 내가 원하는 것을 얻었다. 나는 인덱스에 대해서도 알고 싶다. 모든 테이블 구조가 준비되었을 때 SQL 서버에서 스타 스키마 다이어그램을 생성하는 방법이 있는지 알고 싶습니다. 그렇다면 팩트 테이블을 어떻게 생성합니까?
Deepak

4
뷰에 클러스터형 인덱스를 배치하는 데 대한 제한은 광범위합니다. 예를 들어 뷰는 다른 뷰를 참조 할 수 없으며 외부 조인을 포함 할 수 없습니다. 따라서 더 나은 성능이 필요한 많은 뷰는이 방법을 사용할 수 없습니다. 여전히 좋은 대답입니다.
제프 윌슨

2
관련 질문에서 언급했듯이 MSDN 블로그 기사 인 blogs.msdn.microsoft.com/ssma/2011/06/20/… 에서는 구체화 된 뷰와 인덱싱 된 뷰 간의 몇 가지 주요 차이점을 강조합니다. 가장 문제가되는 IMHO는 새로 고침 트리거를 지정할 수 없다는 것입니다. 인덱스 된 뷰는 기본 테이블이 업데이트 될 때마다 업데이트되어 구체화 된 뷰를 사용하는 대부분의 성능 이점을 약화시킵니다. 조인, 집계, 창 기능 및 하위 쿼리에 대한 금지는 데이터가 자주 변경되지 않는 한 인덱싱 된 뷰를 거의 무의미하게 만듭니다.
Suncat2000 2018

43

순전히 엔지니어링 관점에서 볼 때 인덱스 된 뷰는 모든 사람이 성능을 향상시키는 데 사용할 수있는 것처럼 들리지만 실제 시나리오는 매우 다릅니다. 인덱싱 할 수있는 항목과 인덱싱 할 수없는 항목에 대한 제한이 너무 많기 때문에 가장 필요한 인덱싱 된 뷰를 사용하는 데 실패했습니다.

뷰에 외부 조인이 있으면 사용할 수 없습니다. 또한 공통 테이블 표현식은 허용되지 않습니다. 실제로 하위 선택 또는 파생 테이블 (예 : partition by 절 사용)에 순서가 있으면 운이 좋지 않습니다.

이렇게하면 인덱싱 된 뷰를 활용하는 매우 간단한 시나리오 만 남습니다. 어쨌든 기본 테이블에 적절한 인덱스를 만들어 최적화 할 수 있다고 생각합니다.

사람들이 실제로 인덱싱 된 뷰를 자신의 이익을 위해 사용했고 그것들 없이는 할 수 없었던 실제 시나리오를 듣고 기뻐할 것입니다.


실제로 전체 텍스트 검색 인덱스를 분할하기 위해 인덱싱 된 뷰 (한 번만)를 사용했습니다. FTS 인덱스는 실제로 분할 할 수 없지만 동일한 테이블의 여러 뷰에서 별도의 인덱스를 만들 수 있습니다. 그러나 그것은 일종의 최후의 수단이었습니다.
areyesram

4
(NOEXPAND)인덱싱 된 뷰를 사용하는 쿼리 에 힌트 를 추가해야합니다 . 그리고 그 차이를 알 수 있습니다. 인덱싱 된 뷰 사용과 "적절한 테이블 인덱싱"의 장점은 레코드 선택을 제한하는 것입니다. 그렇지 않으면 정확합니다.
ajeh

네, NOEXPAND는 과소 평가 될 수 없습니다!
Simon_Weaver

18

구체화 된 뷰가 실제로 무엇인지에 대해 좀 더 배경이 필요할 수 있습니다. Oracle에서 이들은 다른 곳에서 빌드하려고 할 때 여러 요소로 구성된 객체입니다.

MVIEW는 본질적으로 다른 소스의 데이터 스냅 샷입니다. 뷰와 달리 데이터는 뷰를 쿼리 할 때 찾을 수 없으며 테이블 형태로 로컬에 저장됩니다. MVIEW는 정기적으로 시작되거나 소스 데이터가 변경 될 때 시작되는 백그라운드 절차를 사용하여 새로 고쳐집니다. Oracle은 전체 또는 부분 새로 고침을 허용합니다.

SQL Server에서는 다음을 사용하여 정기적으로 (완료) 새로 고침하는 기본 MVIEW를 만듭니다.

먼저보기입니다. 보기는 모든 데이터베이스에서 매우 일반적이기 때문에 이것은 대부분의 경우 쉬울 것입니다. 다음, 테이블입니다. 이는 열 및 데이터의보기와 동일해야합니다. 이것은 뷰 데이터의 스냅 샷을 저장합니다. 그런 다음 테이블을 자르고 뷰의 현재 데이터를 기반으로 다시로드하는 프로 시저입니다. 마지막으로 절차를 시작하는 작업이 작동합니다.

다른 모든 것은 실험입니다.


5
SQL Server에 대한 귀하의 의견이 잘못되었습니다. 구체화 된 뷰는 Oracle과 SQL Server에서 매우 다릅니다. SQL Server에서 고유 한 클러스터형 인덱스가있는 뷰 ( "구체화 된 뷰"라고도 함)는 사용자가 업데이트하지 않으며 업데이트 할 수 없으며 별도의 사용자 생성 테이블에 저장되지도 않습니다. 엔진을 업데이트하고 동기화되지 않습니다. 데이터의 스냅 샷을 저장하는 작업이 필요하지 않습니다.
ErikE 2014 년

10
OP가 요청한 것은 인덱싱 된 뷰에서 쉽게 제공됩니다. 이것이 SQL Server가 기본적으로 Oracle 구체화 된 뷰에 제공하는 가장 가까운 것입니다. 그러나 Oracle MVIEW가 작동하는 방식을 정확하게 복제하고 싶거나 필요하다면 Jason이 옳습니다. Jason의 접근 방식은 Oracle MVIEW가 수행 할 수있는 동일한 시나리오에서도 도움이됩니다. 예를 들어보기가 최신 상태 인 것보다 데이터베이스로드에 더 신경을 쓰는보고 테이블을 시간 외 새로 고치는 작업을 수행합니다 (예 : 어제의 수치 만보고 ...)

4

인덱싱 된 뷰가 옵션이 아니고 빠른 업데이트가 필요하지 않은 경우 해킹 캐시 테이블을 만들 수 있습니다.

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

그런 다음 sp_rename view / table을 사용하거나 캐시 테이블을 가리 키도록이를 참조하는 쿼리 또는 다른보기를 변경합니다.

매일 / 야간 / 주간 / 새로 고침하지 않는 일정

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

주의 : 이것은 tx 로그에서도 공간을 차지합니다. 계산 속도가 느린 소규모 데이터 세트에 가장 적합합니다. "쉽지만 큰"열을 먼저 외부보기로 제거하기 위해 리팩터링 할 수 있습니다.


1

MS T-SQL Server의 경우 "include"문을 사용하여 인덱스를 만드는 것이 좋습니다. 고유성이 필요하지 않으며 클러스터형 인덱스와 관련된 데이터의 물리적 정렬도 필요하지 않습니다. "Index ... Include ()"는 시스템에서 자동으로 유지 관리하는 별도의 물리적 데이터 저장소를 만듭니다. 개념적으로 Oracle Materialized View와 매우 유사합니다.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.