Dizin oluşturulmuş görünümler oluşturma

Bir görünüm, üzerinde kümelenmiş dizin oluşturmadan önce aşağıdaki gereksinimleri karşılaması gerekir:

  • create VIEW deyim çalıştırıldığında ANSI_NULLS ve QUOTED_IDENTIFIER seçenekleri on olarak küme olması gerekir.Bu görünümleri raporlar objectproperty işlev ExecIsAnsiNullsOn veya ExecIsQuotedIdentOn özellikleri.

  • ANSI_NULLS seçeneği on olarak görünüm tarafından başvurulan tablolar oluşturmak tüm create table deyimleri yürütülmesi için küme olması gerekir.

  • Görünüm gerekir değil diğer görünümlere başvuru, yalnızca temel tablo.

  • Tüm görünüm tarafından başvurulan temel tablolar gerekir aynı veritabanında görünüm olarak ve aynı sahibe sahip olmalıdır.

  • Görünüm ema BALAMA seçeneğiyle oluşturulması gerekir.Şema bağlama görünümü oluşturan temel tablolarda şemaya bağlar.

  • Kullanıcı tanımlı işlevler görünümde başvurulan ema BALAMA seçeneğiyle oluşturulmuş olması gerekir.

  • Tablo ve kullanıcı tanımlı işlevler görünümünde iki bölümü adları tarafından başvuru olarak gösterilmelidir.Bir bölümü, üç parçalı ve değeri aygıtınkiyle tam olarak adlarına izin verilir.

  • Tüm işlevleri ifadelerde görünüm tarafından başvurulan belirleyici olmalıdır.The IsDeterministic property of the OBJECTPROPERTY function reports whether a user-defined function is deterministic.Daha fazla bilgi için bkz: Deterministic ve FUNCTION işlevleri.

    Not

    Ne zaman size başvurmak için datetime ve smalldatetime dize hazır bilgileri dizin oluşturulmuş görünümler SQL Server 2008, öneririz, açıkça dönüştürmek hazır bilgi tarih türüne, istediğiniz kullanarak bir deterministic tarih biçimi stili.Deterministic tarih biçimlendirme stilleri bir listesi için bkz: CAST ve CONVERT (Transact-SQL).Örtük dönüştürme için karakter dizeleri içeren ifadeler datetime veya smalldatetime uyumluluk düzeyni olmadığı sürece FUNCTION, kabul edilen küme 80 veya daha önceki sürümlerde.Bunun nedeni sunucu oturum dil ve VBLONGDATE ayarları üzerinde sonuçlar bağlıdır.Örneğin, sonuçlar ifadenin CONVERT (datetime, '30 listopad 1996', 113) çünkü dil ayarına göre değişir dize 'listopad' farklı dillerde farklı ay anlamına gelir.Benzer şekilde, ifade DATEADD(mm,3,'2000-12-01'), SQL Server dize yorumlar '2000-12-01' göre VBLONGDATE ayarı.

    Unicode olmayan karakter veri harmanlamaları arasında örtülü dönüşüm da dikkate alınır FUNCTION, uyumluluk düzeyni olmadığı sürece küme 80 veya daha önce.

    Bu ifadeler içeren görünümlerde dizinleri oluşturma 90 uyumluluk modunda izin verilmez.Ancak, yükseltilen bir veritabanından alınan bu ifadeler içeren varolan rahat görünümlerdir.Örtülü içeren dizinli görünümler kullanırsanız, dize dizinlenmiş görünüm Bozulması dönüşümleri tarih, dil ve VBLONGDATE ayarlarını, veritabanları ve uygulamaları mümkün önlemek için tutarlı olmanız için.

  • Görünüm tanımını kullanıyorsa, bir toplu işlev, seçim listesinde COUNT_BIG (*) de eklemeniz gerekir.

  • Veri erişim özellik kullanıcı tanımlı işlev no sql olmalıdır ve dış erişim özellik olmalıdır No

  • Ortak dil çalışma zamanı (clr) işlevleri görünümü seçme listesinde görünür, ancak kümelenmiş dizin anahtar tanımının bir parçası olamaz.clr işlevler görünümü where yan tümce tümce tümce veya görünüm JOIN işleminde on yan tümce tümce tümcesinde bulunamaz.

  • clr işlevler ve clr kullanıcı tanımlı türler görünüm tanımında kullanılan yöntemleri aşağıdaki gösterildiği gibi özellikleri olması gerekir tablo.

    Özellik

     Not

    DETERMINISTIC = TRUE

    Must be declared explicitly as an attribute of the Microsoft .NET Framework method

    KESİN = TRUE

    Bir öznitelik olarak açıkça bildirilmelidir .NET Framework yöntem.

    VERİ ERİŞİMİ YOK SQL =

    Ayarı belirlenen Data Access için öznitelik DataAccessKind.None ve SystemDataAccess için öznitelik SystemDataAccessKind.None.

    DIŞ ERİŞİM = NO

    Varsayılan olarak bu özellik Hayır clr yordamları için ayarlanır.

    clr olağan yöntemleri özniteliklerini küme hakkında daha fazla bilgi için bkz: clr yordamları için özel öznitelikleri.

    Dikkat notuDikkat

    clr yordam özelliklerinin ayarlanması önerilmez yöntemcontradiction işlev s yöntem.Bunu neden olabilir veri bozulması.

  • deyim görünümünde aşağıdakileri içeremez Transact-SQL sözdizimi öğeleri:

    • The * or table_name**.*** sütunları belirtmek için sözdizimi.Sütun adlarını açıkça belirtilmelidir.

    • Birden çok görünüm sütununda basit bir ifade olarak kullanılan tablo sütun adı belirtilemez.Bir sütunda birden çok kez sağlanan tüm ya da tüm başvurulabilir ancak bir sütun başvurusu, karmaşık bir ifade veya bir işlev parametresi bir parçasıdır.Örneğin, aşağıdaki seçim listesi geçerli değil:

      SELECT ColumnA, ColumnB, ColumnA
      

      Bu seçim listesi geçerlidir:

      SELECT SUM(ColumnA) AS SumColA, ColumnA % ColumnB AS ModuloColAColB, COUNT_BIG(*) AS cBig FROM dbo.T1 GROUP BY ModuloColAColB
      
    • Bir deyim üzerinde bir sütun group by yan tümce tümce tümcesinde veya toplu sonuçlar üzerinde bir ifade kullanılır.

    • Türetilmiş bir tablo.

    • Bir ortak tablo ifade (cte).

    • Satır kümesi işlevler.

    • DIŞINDA UNION veya INTERSECT işleçleri.

    • Alt sorgular.

    • Dış veya kendi kendine birleşimler.

    • top yan tümce tümce tümce.

    • order by yan tümce tümce tümce.

    • DISTINCT anahtar sözcüğü.

    • count (COUNT_BIG(*) izin.)

    • avg, max, MIN, STDSAPMA, STDSAPMAS, var veya varp toplu işlevleri.avg (expression) başvuran sorgularda belirtilen dizinli görünüm, toplam görünümü seçim listesi içeriyorsa, en iyi duruma getiricisi gerekli sonucu sık sık hesaplayabilirsiniz (expression) ve COUNT_BIG (expression).Örneğin, bir dizinli görünüm seçim listesi AVG(column1) ifade içeremez.SUM(column1) ve COUNT_BIG(column1), ifadeler görünümü seçim listesi içeriyorsa, SQL Server hesaplamak ortalama bir sorgunun, görünüme başvuran ve belirtir AVG(column1).

    • Toplam işlev , null olabilecek ifade başvuruyor.

    • Sıralama veya toplu penceresi işlevi içerir üzerinden yan tümce tümce tümce.

    • Bir clr kullanıcı tanımlı toplam işlev.

    • Tam metin yüklemler CONTAINS veya freetext.

    • compute veya compute by yan tümce tümce tümce.

    • Çapraz veya dış UYGULAMALISINIZ operators.

    • Özet veya UNPIVOT işleçleri

    • Tablo ipuçları (yalnızca 90 veya daha yüksek uyumluluk düzey için geçerlidir).

    • İpuçları katılın.

    • Xquery ifadelerini doğrudan başvurur.Şemaya bağlı kullanıcı tanımlı bir işlev içinde Xquery ifadeler gibi dolaylı başvuruları kabul edilir.

  • Grupla belirtilirse, görünümü seçim listesi COUNT_BIG(*) ifade içermelidir ve Görünüm tanımında HAVING, güncelleştirme TOPLAMASI, KÜP veya GRUPLANDIRMA KÜMELERİ belirtemezsiniz.

create INDEX deyimi için gereksinimler

Bir görünümde oluşturulan ilk dizin benzersiz kümelenmiş dizin olmalıdır.Benzersiz kümelenmiş dizin oluşturulduktan sonra kümelenmemiş dizinler oluşturabilirsiniz.Dizinler üzerinde görünümler için adlandırma kurallarına tablolarda dizinler aynıdır.Tek fark tablo adı ile bir görünüm adı değiştirilir olmasıdır.Daha fazla bilgi için bkz: CREATE INDEX (Transact-SQL).

create INDEX deyim normal create INDEX gereksinimleri yanı sıra aşağıdaki gereksinimleri karşılaması gerekir:

  • create INDEX yürütür kullanıcı deyim görünümü sahibi olmalıdır.

  • create INDEX deyim yürütüldüğünde aşağıdaki küme seçenekleri on olarak küme olması gerekir:

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

  • NUMERIC_ROUNDABORT seçeneği off için küme olması gerekir.Bu varsayılan ayardır.

  • 80 Uyumluluk modunda veya daha önceki bir veritabanı çalıştıran, ARITHABORT seçeneği olmalıdır küme açık.

  • Kümelenmiş veya kümelenmemiş dizin oluşturduğunuzda, IGNORE_DUP_KEY seçeneğini olmalıdır küme off için (varsayılan kümeting).

  • Görünüm içeremez text, ntext, veya image sütunları olmasa bunlar değil başvuru create INDEX deyim.

  • select deyim görünümünde bir group by yan tümce tümce tümce tanımını belirtir, benzersiz kümelenmiş dizin anahtar yalnızca group by yan tümce tümce tümcende belirtilen sütunlara başvurabilir.

  • Dizin anahtar değerini oluşturan günümüzdeki ifade sütun saklı bir başvuru sütun görünümün temelindeki temel tablo içinde.Bu sütun, bir normal saklı veya sütunu kalıcı hesaplanan sütun olabilir.Diğer günümüzdeki ifadeler parçası olabilir anahtar dizinli görünüm, sütun.

Dikkate Alınacak Noktalar

Ayarı large_value_types_out_of_row sütun dizinli görünüm seçeneği miras karşılık gelen temel tablo sütununda ayarı.Bu değer kullanılarak küme sp_tableoption.İfadeleri sütunlar için varsayılan ayarı 0'dır.Bu, büyük bir değer türü satır içinde saklı olduğunu anlamına gelir.Daha fazla bilgi için bkz: Büyük değer veri türleri'ni kullanma.

After the clustered index is created, any connection that tries to modify the base data for the view must also have the same option settings required to create the index.SQL Server generates an error and rolls back any INSERT, UPDATE, or DELETE statement that will affect the result set of the view if the connection executing the statement does not have the correct option settings.Daha fazla bilgi için bkz: Sonuçları etkileyen seçeneklerini ayarlama.

Tüm dizinler bir görünümde görünüm kesildiği zaman bırakılır.Kümelenmiş dizin kesildiği zaman tüm kümelenmemiş 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.Tek tek kümelenmemiş dizinler silinebilir.Saklı sonuç küme görünüm üzerinde kümelenmiş dizin bırakarak ortadan kaldırır ve Görünüm gibi standart bir görünüm işleme için en iyi duruma getiricisi döndürür.

Kümelenmiş dizin anahtar oluşturan sütunların oluşturmak benzersiz kümelenmiş dizin içinde belirtilen rağmen deyim, görünümün tam sonuç küme veritabanında depolanır.Kümelenmiş bir dizin gibi temel bir tablo üzerinde yalnızca anahtar sütunları kümelenmiş dizin B-ağacı yapısını içerir, ancak görünümdeki tüm sütunları veri satırlarını içeren sonuç küme.

Dizinler görünümler için varolan bir sisteme eklemek isterseniz, şema olmalıdır dizin yerleştirmek istediğiniz herhangi bir görünüm bağlamak.Aşağıdaki işlemleri gerçekleştirebilirsiniz:

  • Görünüm açılır ve onu ile ema BALAMA belirterek yeniden oluşturun.

  • Varolan bir görünümü, ancak farklı bir ad olarak aynı metni içeren ikinci bir görünüm oluşturabilirsiniz.Sorgular from yan tümce tümce tümcesinde doğrudan başvurulmuyor bile iyileştirici yeni görünüm, dizinler dikkate alır.

    Not

    ŞEMA ile oluşturulan bir görünüm katılan tablolar veya görünümlerbağlama yan tümce tümce tümce olamaz bıraktı, artık şema sahip olacak şekilde görünümü bırakılan veya sürece bağlama.Ayrıca, alter table deyimleri şemasına sahip görünümlerinde katılmak tablolarda bağlama Bu ifadeler görünüm tanımını etkiler başarısız olur.

Yeni Görünüm dizinli görünüm, tüm gereksinimlerini karşıladığından emin olmanız gerekir.Görünümü ve bunların tümünü aynı kullanıcı tarafından sahip olduğu için başvuran tüm temel tablolar sahipliğini değiştirmek gerekebilir.

Tablolar ve görünümler üzerinde dizinler devre dışı bırakılabilir.Bir tabloda kümelenmiş dizin devre dışı bırakıldığında, tablo ile ilgili görünümlerde dizinleri de devre dışı bırakılır.Daha fazla bilgi için bkz: Dizinler devre dışı bırakma.

Örnek

Aşağıdaki örnek, bu görünümü bir görünüm ve bir dizin oluşturur.İki sorgu dahil kullanan dizinli görünüm.

USE AdventureWorks2008R2;
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