기존 제품을 조정하기 위해 항상 SQL Server에서 인덱싱 된 뷰를 작성합니다. 적절한 컬럼을 사용하는 경우 옵티마이 저는 인덱스를 사용하기에 충분합니다.
예제를 사용하면 뷰를 만든 것처럼 보이지만 실제로 인덱스를 만들지는 않았습니다.
if object_id(N'mytable1') is not null
drop table mytable1
if object_id(N'mytable2') is not null
drop table mytable2
go
Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO
insert into mytable1 values ('steve')
insert into mytable1 values ('jack')
insert into mytable1 values ('mike')
insert into mytable1 values ('ralph')
insert into mytable1 values ('simon')
insert into mytable2 values ('smith')
insert into mytable2 values ('jackson')
insert into mytable2 values ('mikaelson')
insert into mytable2 values ('montalvo')
insert into mytable2 values ('singer')
go
if object_id(N'myview') is not null
drop view myview
go
Create view myview
with schemabinding
as
select a.id, a.name1, b.name2
from dbo.mytable1 a
join dbo.mytable2 b on a.Id = b.Id
GO
select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO
이 뷰에는 인덱스가 없으므로 기본 테이블을 스캔합니다.
그러나 인덱스를 추가하면 옵티마이 저가 인덱스를 사용할 수 있습니다.
CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
[name1] ASC,
[name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
이것은 적절하게보기를 사용했습니다.
테이블 대신보기에서 선택하도록 모든 SQL 스크립트를 변경할 수 없습니다. 인덱스 된 뷰를 만들고 SQL Server가 테이블 대신 데이터를 가져 오도록하고 싶습니다.
쿼리에서 참조되지 않을 때 SQL Server가 인덱싱 된 뷰를 사용하도록하는 힌트 나 다른 방법은 없습니다.
추가 정보 ( Geoff Patterson 제공 )
한 가지 추가 사항은 Enterprise Edition에서만 옵티마이 저가 인덱싱 된 뷰를 사용할 수 NOEXPAND
있지만 사용중인 뷰 인덱스를 100 % 확신해야하는 경우 힌트를 사용하여 뷰를 직접 참조하는 것이 좋습니다. Standard Edition에서 사용하려는 경우
Enterprise Edition에서도 옵티마이 저가 뷰 인덱스를 사용하지 않으면 뷰 인덱스를 사용할 수 없다는 사실을 알지 못하는 쿼리를 자주 보았습니다 NOEXPAND
. 복잡한 쿼리에서는 더 일반적이지만 간단한 쿼리에서도 발생할 수 있습니다.
Paul White는 뉘앙스를 살펴보면서 읽은 더 나은 기사 중 하나 입니다 NOEXPAND
. 뷰 인덱스의 사용 이외에도 힌트는 통계가 인덱스 된 뷰에서 자동으로 생성되는지 여부 및 계획의 카디널리티 추정치에 영향을 줄 수 있습니다.
그리고에서 젠 : 사이드 참고로, 그것은 당신의 갱신, 삽입 및 삭제 시간에 추가됩니다 다른 인덱스 등의 인덱싱 된 뷰에주의.