Aracılığıyla paylaş


Görünüm çözümleme

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

  • dizinli görünüm satır aynı biçimde bir tablo veritabanında depolanır.sorgu iyileştiricisi Bir sorgu planı içinde dizinli görünüm kullanmaya karar verir dizinlenmiş görünümün temel tablo ile aynı şekilde işlem görür.

  • Yalnızca dizine alınmamış bir görünüm tanımını depolanan görünümün satırları.sorgu iyileştiricisi , Dizine alınmamış görünüme başvuran SQL deyim oluşturur yürütme planı içine mantığından görünüm tanımını içerir.

Tarafından kullanılan mantığı SQL Server sorgu iyileştiricisi dizinli görünüm kullanmak ne zaman karar vermek için bir tablo üzerinde bir dizin kullanmak ne zaman karar vermek için kullanılan mantığı benzer.dizinli görünüm verileri SQL deyim bölümünü veya tümünü kapsıyorsa ve sorgu iyileştiricisi düşük maliyetli erişim yol bir dizin görünümünde olduğunu belirleyen sorgu iyileştiricisi dizini olup görünüm adı sorgu tarafından başvurulan olsun seçecektir.Daha fazla bilgi için bkz: Dizinler üzerinde görünümler çözme.

Ne zaman bir sql deyim başvuran ayrıştırıcı dizine alınmamış bir görünüm ve sorgu iyileştiricisi sql deyim hem görünümü, kaynak çözümleme ve sonra bunları 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 görünüm göz önünde bulundurun:

USE AdventureWorks2008R2;
GO
CREATE VIEW EmployeeName AS
SELECT h.BusinessEntityID, p.LastName, p.FirstName
FROM HumanResources.Employee AS h 
JOIN Person.Person AS p
ON h.BusinessEntityID = p.BusinessEntityID;
GO

Bu görünümünü temel alan, her ikisi de bu sql deyimlerini temel tablolar aynı işlemleri gerçekleştirmek ve aynı üretmek sonuçlar:

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

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

The SQL Server Management Studio Showplan feature shows that the relational engine builds the same execution plan for both of these SELECT statements.

Görünümlerle ipuçlarını kullanarak

Bir sorgu görünümlerinde yerleştirilir ipuçları onun temel tablolara erimek için görünümü ne zaman genişletilir keşfedilen diğer ipuçları ile çakışabilir.Bu durumda, sorgu hata verir.Örneğin, bir tablo ipucu kendi tanımında içeren aşağıdaki görünüm göz önünde bulundurun:

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

Çünkü sorgu başarısız ipucu görünümü üzerinde uygulanan SERIALIZABLE Person.AddrState sorgu ise değerler için her iki tabloyu Person.Address ve Person.StateProvince onu genişletildiğinde görünümünde.Ancak, genişletme görünümü de nolock ipucunu üzerinde gösteren Person.Address.SERIALIZABLE ve nolock ipuçları çakışmayı, sonuçta elde edilen sorgu yanlış çünkü.

Gibi nolock, READCOMMITTED, holdlock paglock nolock, satırı KİLİTLE, tablock veya tablockx tablo ipuçları çakışmayı birbirleriyle, repeatableread, SERIALIZABLE ipuçları tablo.

İpuçları görünümler iç içe düzeyleri arasında yayabilir.Örneğin, bir sorgu bir görünüm holdlock ipucu uygulanır varsayalım v1.Zaman v1 olan Genişletilmiş, biz o arama görünümü v2 bir parçasıdır, tanımı.v2kişinin kendi temel tablolar üzerinde bir nolock ipucunu tanımı içerir.Ancak bu tablo da holdlock ipucu sorgu görünümünde devraldığı 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 bir sorgu içinde kullanıldığında, içinde Görünümü Tabloları birleştirmek sırasını konumda görünümün sıralı yapı tarafından belirlenir.Ö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;

The birleştirmek order in the query plan is Table1, Table2, TableA, TableB, Table3.