SQL Server'da dizinlenmiş görünüm


11

Benim gibi bir tablo ve dizinlenmiş bir görünüm var

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

Şimdi aşağıdaki sorguyu çalıştırırsam

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

Dizine alınmış görünümümü kullanmıyor. SQL Server'ı dizinli görünüm kullanmaya zorlamak için herhangi bir ipucu (veya başka bir yol) var mı?

Büyük bir sistemim var ve onu optimize etmem gerekiyor. 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.

SQL Server 2014 Enterprise Edition kullanıyorum.


Büyük bir sistemim var ve onu optimize etmem gerekiyor. Tablolar yerine görünümden seçmek için tüm sql scriptlerimi değiştiremiyorum. Dizinlenmiş görünümler oluşturmak ve tablolar yerine onlardan veri almak için sql sunucusu zorlamak istiyorum.
Artashes Khachatryan

Yanıtlar:


23

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: resim açıklamasını buraya girin

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ı: resim açıklamasını buraya girin

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 NOEXPANDgö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.


-5

Uygulama kodunuzu yeni nesne adlarıyla değiştiremezseniz, uygulama kullanıcınızı yeni bir varsayılan şema kullanacak ve aynı nesne adlarını kullanan başka bir şemada dizine alınmış görünümler oluşturabilirsiniz. Örneğin:

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

Tabii ki bu sadece uygulama kodunda şema adlarını kullanmadıysanız çalışır.

Varsa, tüm nesneleri yeni bir şemaya taşıyabilir ve bunun yerine eski şemadaki görünümleri tanıtabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.