Aracılığıyla paylaş


Görüntüleme ve çözümleme

The SQL Server query processor treats indexed and nonindexed views differently:

  • dizinli görünüm satırları aynı tablo biçiminde veritabanında depolanır.dizinli görünüm, bir sorgu planı kullanmak sorgu iyileştiricisi karar verirse, dizinlenmiş görünümün temel tablo aynı kabul edilir.

  • Depolanan dizinlenmemiş görünüm tanımı, görünüme satırları.sorgu iyileştiricisi görünüm tanımının mantığından, dizinlenmemiş görünüme başvuran SQL deyim oluşturur yürütme planı içine ekler.

Tarafından kullanılan mantığı SQL Server dizinli görünüm kullanmak, karar vermek için sorgu iyileştiricisi, tablo üzerinde bir dizin ne zaman karar vermek için kullanılan mantığı benzer. dizinli görünüm verileri SQL deyim bir bölümünü veya tümünü kapsar ve sorgu iyileştiricisi görünümdeki bir dizin, düşük maliyetli bir erişim yol olduğunu belirler, sorgu iyileştiricisi olup görünümü sorgu adı tarafından başvurulan bakılmaksızın dizini seçer.Daha fazla bilgi için bkz:Görünümler, bir ındexes çözümleniyor.

Bir SQL deyim dizinlenmemiş bir görünüme başvuruyor, çözümleyici ve sorgu iyileştiricisi SQL deyimini hem de görünüm kaynağını çözümlemek ve bir tek bir yürütme planına çözmek.SQL deyim için bir plan ve görünüm için ayrı bir planı yok.

Örneğin, aşağıdaki noktaları dikkate alın:

USE AdventureWorks;
GO
CREATE VIEW EmployeeName AS
SELECT h.EmployeeID, c.LastName, c.FirstName
FROM HumanResources.Employee AS h 
JOIN Person.Contact AS c
ON h.ContactID = c.ContactID;
GO

Bu görünüm, her ikisi de bu SQL deyimlerini temel tablolarda işlemlerin aynısını gerçekleştirir ve aynı sonucu verir:

/* SELECT referencing the EmployeeName view. */
SELECT LastName AS EmployeeLastName, SalesOrderID, OrderDate
FROM AdventureWorks.Sales.SalesOrderHeader AS soh
JOIN AdventureWorks.dbo.EmployeeName AS EmpN
ON (soh.ContactID = EmpN.EmployeeID)
WHERE OrderDate > '20020531';

/* SELECT referencing the Contact and Employee tables directly. */
SELECT LastName AS EmployeeLastName, SalesOrderID, OrderDate
FROM AdventureWorks.HumanResources.Employee AS e 
JOIN AdventureWorks.Sales.SalesOrderHeader AS soh
ON soh.SalesPersonID = e.EmployeeID
JOIN AdventureWorks.Person.Contact AS c
ON e.ContactID =c.ContactID
WHERE OrderDate > '20020531';

The SQL Server Management Studio gösterim planı feature shows that the ilişkisel altyapı builds the same execution plan for both of these SELECT statements.

Ipuçları ile görünümleri kullanma

Bir sorgu görünümlerinde yerleştirilir, ipuçları, görünüm, temel tabloları erişmek için ne zaman genişletilir bulunan diğer ipuçları ile çakışabilir.Bu durumda, sorgu hata verir.Örneğin, bir tablonun ipucu tanımını içeren aşağıdaki görünüm göz önünde bulundurun:

USE AdventureWorks;
GO
CREATE VIEW Person.AddrState WITH SCHEMABINDING AS
SELECT a.AddressID, a.AddressLine1, 
    s.StateProvinceCode, s.CountryRegionCode
FROM Person.Address a WITH (NOLOCK), Person.StateProvince s
WHERE a.StateProvinceID = s.StateProvinceID;

Şimdi bu sorguyu girin varsayalım:

SELECT AddressID, AddressLine1, StateProvinceCode, CountryRegionCode
FROM Person.AddrState WITH (SERIALIZABLE)
WHERE StateProvinceCode = 'WA';

Sorgu başarısız, çünkü görünüm uygulanan SERIALIZABLE ipucu Person.AddrState Sorguda için her iki tabloda yayılır Person.Address ve Person.StateProvince genişletildiğinde, görünümü. Ancak, görünümün genişletiliyor de NOLOCK ipucunu üzerinde gösterir Person.Address. Çakışma SERIALIZABLE ve NOLOCK ipuçları için sonuçta elde edilen sorgu yanlıştır.

Olduğu gibi NOLOCK, READCOMMITTED, HOLDLOCK PAGLOCK, NOLOCK ROWLOCK TABLOCK veya TABLOCKX tablo ipuçları çakışmayı birbirleriyle, ipuçlarını REPEATABLEREAD, SERIALIZABLE tablosu.

Ipuçları, iç içe geçmiş görünümleri düzeyde yaymak.Örneğin, bir sorgu, bir görünüm HOLDLOCK ipucu uygulanır varsayalım. v1. Ne zaman v1 olan o görünümü buluyoruz genişletilmiş v2 tanımını parçasıdır. v2tanım, temel tablo üzerinde bir NOLOCK ipucunu içeren alan.Bu tablo görünümünde sorgudan HOLDLOCK ipucu da devralır, ancak v1. Çakışma NOLOCK ve HOLDLOCK ipuçları için sorgu başarısız olur.

FORCE ORDER ipucu görünümü içeren sorguda kullanıldığında, sıralı yapısında görünümü konumunu görünümü içinde tablo birleştirmek sırasını saptanır.Örneğin, aşağıdaki sorgu, üç tablo ve Görünüm seçer:

SELECT * FROM Table1, Table2, View1, Table3
WHERE Table1.Col1 = Table2.Col1 
    AND Table2.Col1 = View1.Col1
    AND View1.Col2 = Table3.Col2;
OPTION (FORCE ORDER)

Ve View1 aşağıdaki gibi tanımlanır:

CREATE VIEW View1 AS
SELECT Colx, Coly FROM TableA, TableB
WHERE TableA.ColZ = TableB.Colz;

Sorgu planı birleştirmek sıradır Table1, Table2, TableA, TableB, Table3.