Dizin oluşturulmuş görünümler oluşturma
Dizin oluşturulmuş görünüm oluşturma açıklanmıştır SQL Server 2012kullanarak Transact-SQL. Bir görünüm oluşturulmuş ilk dizin benzersiz kümelenmiş bir dizin olmalıdır. Benzersiz kümelenmiş dizin oluşturulduktan sonra ek kümelendirilmemiş dizinler oluşturabilirsiniz. Görünümün kümelenmiş bir dizin olan bir tablonun saklı olduğu aynı şekilde veritabanında depolanan bir görünüme benzersiz kümelenmiş dizin oluşturma sorgu performansı artırır. Query optimizer kadar sorgu yürütme hızlandırmak için dizin oluşturulmuş görünümler kullanabilirsiniz. Görünümü, sorgu Doktoru bu görünümü için bir ikame dikkate almak için başvurulacak yok.
Bu Konuda
Başlamadan Önce
Sınırlamalar ve Kısıtlamalar
Öneriler
Dikkate Alınacak Noktalar
Güvenlik
Dizin oluşturulmuş bir oluşturmak için kullanarak görüntüleyin:
Transact-SQL
Başlamadan Önce
Aşağıdaki adımlar, dizin oluşturulmuş görünüm oluşturmak için gereklidir ve dizinlenmiş görünümün başarıyla uygulanması için Kritik:
set seçenekleri görünümde başvurulan tüm varolan tablolar için doğru olduğunu doğrulayın.
set seçenekleri oturum için doğru yeni tablo ve görünüm oluşturmadan önce doğrulayın.
Görünüm tanımını deterministik olduğunu doğrulayın.
Görünüm WITH SCHEMABINDING seçeneğini kullanarak oluşturun.
Benzersiz kümelenmiş dizin üzerinde görünüm oluşturun.
Dizin oluşturulmuş görünümler için gerekli set seçenekleri
Aynı ifade değerlendirme farklı sonuçlar üretebilir Veritabanı Altyapısıfarklı set seçenekleri etkin değilse ne zaman sorgu yürütüldüğünde. Örneğin set seçenek CONCAT_NULL_YIELDS_NULL on, ifade için ayarlanır sonra 'abc' + null null değerini döndürür. Ancak, CONCAT_NULL_YIEDS_NULL off için ayarlanır sonra aynı ifadeyi üreten 'abc'.
Doğru tutulabilir ve tutarlı sonuçlar görüşlerini emin olmak için dizin oluşturulmuş görünümler için birkaç ayarlama seçenekleri sabit değerleri gerektirir. set seçenekleri aşağıdaki tabloda gösterilen değerlere ayarlanmalıdır gereklideğeri aşağıdaki koşullar gerçekleştiğinde sütunu:
Görünümü ve sonraki görünümü dizinler oluşturulur.
Orada herhangi bir ekleme, güncelleştirme veya silme işlemi gerçekleştirilen dizinli görünüme katılan bir tabloyu. Bu toplu kopyalama, çoğaltma ve dağıtılmış sorgular gibi işlemleri içerir.
Dizin oluşturulmuş görünüm sorgu en iyi duruma getiricisi tarafından sorgu planı üretmek için kullanılır.
SET seçenekleri
Gerekli değer
Varsayılan sunucu değerini
Default
ole db ve odbc değer
Default
db Kitaplığı değer
ANSI_NULLS
ON
ON
ON
OFF
ANSI_PADDING
ON
ON
ON
OFF
ANSI_WARNINGS *
ON
ON
ON
OFF
ARITHABORT
ON
ON
OFF
OFF
CONCAT_NULL_YIELDS_NULL
ON
ON
ON
OFF
NUMERIC_ROUNDABORT
OFF
OFF
OFF
OFF
QUOTED_IDENTIFIER
ON
ON
ON
OFF
Veritabanı uyumluluk düzeyi 90 veya daha yüksek olarak ayarlandığında ANSI_WARNINGS on olarak örtülü ayarı ARITHABORT on olarak ayarlar.
Bir ole db veya odbc sunucusu bağlantısı kullanıyorsanız, değiştirilmesi gerekir sadece ARITHABORT ayarı değerdir. Tüm db Kitaplığı değerleri doğru sunucu düzeyinde ya da kullanılarak ayarlanmalıdır sp_configure veya set komutunu kullanarak uygulama. set seçenekleri hakkında daha fazla bilgi için bkz: Using Options in SQL Server.
Önemli |
---|
ARITHABORT kullanıcı seçenek sunucu bazındaki on ilk görünümü dizine veya hesaplanmış bir sütun üzerinde dizin sunucusundaki bir veritabanı oluşturulur olarak ayarlanması önerilir. |
Deterministik bakıldı
Dizin oluşturulmuş görünüm tanımını deterministik olması gerekir. Bir görünüm seç listesinde, eğer tüm deterministik ifadeleridir yanı sıra nerede ve group by yan tümceleri, deterministik. Deterministik ifadeler her zaman belirli bir giriş değerleri kümesiyle değerlendirilen her zaman aynı sonucu döndürür. Sadece deterministic işlevler deterministic ifadelerde katılabilir. Örneğin, her zaman onun üç parametre bağımsız değişkeni değerleri verilen herhangi bir dizi için aynı sonucu verdiği için dateadd işlevini deterministic olur. getdate deterministic değil, çünkü hep aynı argüman, ancak her zaman yürütülecek olan değişiklikleri döndürdüğü değeri ile çağrılır.
Kullanım IsDeterministic özelliği columnproperty görünümü sütun deterministic olup olmadığını belirlemek için işlevi. Kullanım IsPrecise Şema Cilt görünümüyle deterministik bir sütunda kesin olup columnproperty işlevi özelliği. columnproperty geçersiz giriş için doğru ise 1, yanlış ise 0 ve null döndürür. Sütun deterministic ya da değil kesin değil yani.
İfade deterministik, kayan nokta ifade, varsa bile kesin sonuç işlemci mimarisi ya microcode sürümüne bağlı olabilir. Veri bütünlüğü sağlamak amacıyla bu tür ifadeler dizinlenmiş görünümler yalnızca anahtar olmayan sütun olarak katılabilir. Kayan nokta ifade içermeyen deterministik ifadeleri kesin olarak adlandırılır. Sadece kesin deterministik ifadeleri anahtar sütunları ve nerede katılabilir veya group by yan tümceleri dizinlenmiş görünümler.
Ek gereksinimler
set seçenekleri ve deterministic işlevi gereksinimleri yanı sıra, aşağıdaki gereksinimlerin karşılanması gerekir:
create INDEX yürütür kullanıcı görünümü sahibi olmalıdır.
Dizin oluşturduğunuzda, IGNORE_DUP_KEY seçeneğini (varsayılan ayar) olarak ayarlanmalıdır.
Temel tablolarda doğru set seçenekleri olması gerekir zaman tablosu oluşturulur veya şema bağlama ile görünüm tarafından başvurulamaz.
Tablolar Şemaiki bölümü adları tarafından başvurulan schema**.**tablename, view definition.
Kullanıcı tanımlı işlevler, WITH SCHEMABINDING seçeneğini kullanarak oluşturulmalıdır.
Kullanıcı tanımlı işlevler Şemaiki bölümü adları tarafından başvurulan schema**.**function.
WITH SCHEMABINDING seçeneğini kullanarak görünüm oluşturulmalıdır.
Görünüm, yalnızca aynı veritabanında, diğer görünümler temel tabloları başvuru gerekir.
Görünüm tanımını birini içermemelidir:
COUNT(*)
Satır kümesi işlevi
Türetilmiş bir tablo
birleşim
FARKLI
STDEV, VARYANS, AVG
float*, text, ntext, or image columns
Alt sorgu
tam metin yüklemler (içeren, freetext)
NULL olabilecek ifade üzerinde topla
clr kullanıcı tanımlı toplama işlevi
Sayfanın Üstü
MIN, MAX
UNION
* Dizinlenmiş görünümün içerebilir floatsütunları; Ancak, bu tür sütunları Kümelenmiş dizin anahtar eklenemez.
group by varsa, görünüm tanımını COUNT_BIG(*) içermelidir ve HAVING içermemelidir. Bu grupla kısıtlamalar yalnızca dizin oluşturulmuş görünüm tanımı için geçerli. Bu grupla kısıtlamalar tatmin etmez bile sorgu ve yürütme planı dizin oluşturulmuş görünüm kullanabilirsiniz.
Görünüm tanımının select deyiminde group by yan tümcesi belirtirse, benzersiz kümelenmiş dizin anahtarı yalnızca group by yan tümcesinde belirtilen sütunlara başvurabilir.
Görünüm tanımını bir group by yan tümcesi içeriyorsa, benzersiz kümelenmiş dizin anahtarı yalnızca group by yan tümcesinde belirtilen sütunlara başvurabilir.
Öneriler
Ne zaman başvurmak için datetimeve smalldatetimedize harflerin dizin oluşturulmuş görünümler, öneririz size açıkça bire bir deterministik Tarih biçimi stili kullanarak istediğiniz tarihi türe dönüştürmek ki. Deterministic Tarih biçimi stiller listesi için bkz: CAST ve CONVERT (Transact-SQL). Örtük dönüştürme karakter dizeleri içeren ifadeler datetimeya smalldatetimenondeterministic düşünülür. Bu sonuçlar bağlıdır çünkü dili ve dateformat ayarları sunucu oturumu. Örneğin, deyimin sonuçlarına CONVERT (datetime, '30 listopad 1996', 113)Dil çünkü bağlıdır dize 'listopad' farklı diller için farklı aylarda anlamına gelir. Benzer şekilde, ifadesinde DATEADD(mm,3,'2000-12-01'), SQL Serverdize yorumlayan '2000-12-01'dateformat ayarına göre.
Unicode karakter veri harmanlamaları arasında örtülü dönüşüm de nondeterministic kabul edilir.
Bu örtük dönüştürme ifadeler içeren görüşlere dizinler oluşturma uyumluluk düzeyi 90 ve daha yüksek izin verilmez. Ancak, yükseltilen veritabanından alınan bu ifadeler içeren varolan görünümleri bakımı. Tarihi dönüştürmeleri örtük dize içeren dizin oluşturulmuş görünümler kullanırsanız, dil ve Tarih biçimi ayarları, veritabanları ve uygulamaları olası dizin oluşturulmuş görünüm bozulmasını önlemek için tutarlı olduğunu emin olun.
Dikkate Alınacak Noktalar
Ayarı large_value_types_out_of_row dizin oluşturulmuş görünüm sütunlar seçeneği karşılık gelen sütun temel tablo ayarı kalıtsal. Bu değer kullanılarak ayarlanır sp_tableoption. İfadelerinden oluşan sütunlar varsayılan ayarı 0'dır. Bu büyük bir değer türü satır içinde saklı olduğu anlamına gelir.
Dizin oluşturulmuş görünümler bölümlenmiş bir tablo oluşturulabilir ve kendilerini bölümlenebilir.
Önlemek için Veritabanı AltyapısıDizinli görünümleri kullanarak, sorgu seçeneği (görünümler genişletin) ipucu içerir. Listelenen seçeneklerden birini yanlış ayarlanmışsa, Ayrıca bu iyileştirici hit dizinleri kullanarak engeller. SEÇENEK (görünümler genişletin) İpucu hakkında daha fazla bilgi için bkz: select (Transact-sql).
Tüm dizinler bir görünüm, görünüm bırakılan bırakılır. Kümelenmiş dizin bırakılan her kümelendirilmemiş dizinleri ve görünümünde otomatik oluşturulan istatistikleri bırakılır. Kullanıcı tarafından oluşturulan istatistikleri görünüm korunur. Kümelendirilmemiş dizinler için ayrı ayrı düştü. Saklı sonuç kümesi görünüm üzerinde Kümelenmiş dizin bırakarak kaldırır ve Doktoru gibi standart bir görünümü görünüm işleme için döndürür.
Tablolar ve görünümler üzerinde dizinler devre dışı bırakılabilir. Tablo kümelenmiş bir dizin devre dışı bırakıldığında, tabloyla ilişkilendirilmiş görünümlerde dizinleri de devre dışı bırakılır.
Güvenlik
İzinler
create VIEW izni veritabanında ve görünümü oluşturulmaktadır şema alter izni gerektirir.
[Top]
Transact-SQL'i Kullanma
Dizin oluşturulmuş görünüm oluşturma
İçinde Object Explorer, örneğine bağlanmak Veritabanı Altyapısı.
Standart çubuğunda Yeni sorgu.
Kopyalama ve aşağıdaki örnek sorgu penceresine yapıştırın ve tıkırtı Execute. Örnek görünümü Bu görünüm dizin oluşturur. İki sorgu dahil dizinlenmiş görünümün kullanın.
USE AdventureWorks2012; GO --Set the options to support indexed views. SET NUMERIC_ROUNDABORT OFF; SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON; GO --Create view with schemabinding. IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL DROP VIEW Sales.vOrders ; GO CREATE VIEW Sales.vOrders WITH SCHEMABINDING AS SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o WHERE od.SalesOrderID = o.SalesOrderID GROUP BY OrderDate, ProductID; GO --Create an index on the view. CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON Sales.vOrders (OrderDate, ProductID); GO --This query can use the indexed view even though the view is --not specified in the FROM clause. SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev, OrderDate, ProductID FROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID AND ProductID BETWEEN 700 and 800 AND OrderDate >= CONVERT(datetime,'05/01/2002',101) GROUP BY OrderDate, ProductID ORDER BY Rev DESC; GO --This query can use the above indexed view. SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev FROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID AND DATEPART(mm,OrderDate)= 3 AND DATEPART(yy,OrderDate) = 2002 GROUP BY OrderDate ORDER BY OrderDate ASC; GO
Daha fazla bilgi için, bkz. CREATE VIEW (Transact-SQL).
[Top]
Ayrıca bkz.
Başvuru
set ANSI_PADDING (Transact-sql)
set ANSI_WARNINGS (Transact-sql)
set CONCAT_NULL_YIELDS_NULL (Transact-sql)