Mevcut ürünleri ayarlamak için SQL Server'da her zaman dizinlenmiş görünümler oluşturun. Optimize edici, uygun sütunları kullanıyorsanız dizini kullanacak kadar akıllıdır.
Örneğinizi kullanarak, görünümü oluşturmuş gibi görünüyorsunuz, ancak aslında üzerinde bir dizin oluşturmadınız.
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
Bu görünümde dizin olmadığından temel tabloları tararız:
Ancak bir dizin eklediğimizde, optimize edici dizini kullanabilir:
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
Bu, görüşü uygun şekilde kullandı:
Tablolar yerine görünümden seçmek için tüm SQL komut dosyalarımı değiştiremiyorum. Dizinlenmiş görünümler oluşturmak ve tablolar yerine onlardan veri almak için SQL Server zorlamak istiyorum.
Sorguda başvurulmadığında SQL Server'ı dizinlenmiş bir görünüm kullanmaya zorlamak için herhangi bir ipucu veya başka bir yöntem yoktur.
Ek bilgiler ( Geoff Patterson'dan )
Ek bir nokta, optimizer'ın yalnızca Enterprise Edition'da bu durumda dizine alınmış görünümü kullanabilmesine rağmen, kullanılan NOEXPAND
görünüm dizininden% 100 emin olmanız gerekiyorsa ipucu kullanarak doğrudan görünüme başvurmak mantıklı olabilir veya Standart Sürüm'de kullanılmasını istiyorsanız.
Optimize edici kullanılmadığı sürece görünüm endeksinin kullanılabileceği gerçeğini almadığı Enterprise Edition'da bile sık sık sorgular gördüm NOEXPAND
. Karmaşık sorgularda daha yaygındır, ancak basit sorgularda da olabilir.
Paul White, nüansları inceleyerek okuduğum en iyi makalelerden birine sahip NOEXPAND
; ipucu sadece görünüm endeksinin kullanılmasının ötesinde, planın endeksli görünüm ve kardinalite tahminlerinde istatistiklerin otomatik olarak oluşturulup oluşturulmadığı gibi şeyleri de etkileyebilir.
Ve Zane'den : Bir yan not olarak, güncelleme, ekleme ve silme sürelerinize ekleyeceği diğer dizinlerde olduğu gibi dizine alınmış görünümlere dikkat edin.