SQL Server의 인덱싱 된 뷰


11

나는 테이블과 인덱스 뷰를 가지고있다.

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

이제 다음 쿼리를 실행하면

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

인덱싱 된 뷰를 사용하지 않습니다. SQL Server가 인덱싱 된 뷰를 대신 사용하도록하는 힌트 (또는 다른 방법)가 있습니까?

시스템이 크므로 최적화해야합니다. 테이블 대신보기에서 선택하도록 모든 SQL 스크립트를 변경할 수 없습니다. 인덱스 된 뷰를 만들고 SQL Server가 테이블 대신 데이터를 가져 오도록하고 싶습니다.

SQL Server 2014 Enterprise Edition을 사용하고 있습니다.


시스템이 크므로 최적화해야합니다. 테이블 대신보기에서 선택하도록 모든 SQL 스크립트를 변경할 수 없습니다. 인덱싱 된 뷰를 만들고 SQL Server가 테이블 대신 데이터를 가져 오도록하고 싶습니다.
Artashes Khachatryan

답변:


23

기존 제품을 조정하기 위해 항상 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. 뷰 인덱스의 사용 이외에도 힌트는 통계가 인덱스 된 뷰에서 자동으로 생성되는지 여부 및 계획의 카디널리티 추정치에 영향을 줄 수 있습니다.

그리고에서 : 사이드 참고로, 그것은 당신의 갱신, 삽입 및 삭제 시간에 추가됩니다 다른 인덱스 등의 인덱싱 된 뷰에주의.


-5

응용 프로그램 코드를 새 객체 이름으로 변경할 수없는 경우 응용 프로그램 사용자가 새로운 기본 스키마를 사용하고 동일한 객체 이름을 사용하여 다른 스키마에서 인덱싱 된 뷰를 만들도록 변경할 수 있습니까? 예를 들어 :

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

물론 이것은 응용 프로그램 코드에서 스키마 이름을 사용하지 않은 경우에만 작동합니다.

있는 경우 모든 오브젝트를 새 스키마로 이동하고 대신 이전 스키마의보기를 도입 할 수 있습니다.

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