Rozdzielczość widoku

SQL Server Kwerendy procesora traktuje Widoki indeksowane i nieindeksowanych inaczej:

  • Wiersze w indeksowany widok są przechowywane w bazie danych w formacie tabela.Jeżeli optymalizator kwerendy zdecyduje się użyć indeksowany widok planu kwerend, indeksowany widok jest traktowany jak w tabela bazowa.

  • Znajduje tylko definicję widoku nieindeksowanych nie wierszach widoku.optymalizator kwerendy zawiera logikę z definicji widoku do planu wykonania, buduje instrukcja języka SQL odwołującej się do widoku nieindeksowanych.

Logika używana przez SQL Server optymalizator kwerendy zdecydować, kiedy używać indeksowany widok przypomina logice używanej zdecydować, kiedy używać indeksu na tabela.Jeśli dane w widoku indeksowanym obejmuje całość lub część instrukcja języka SQL i optymalizator kwerendy określa, że indeks w widoku jest dostęp tanich ścieżka, optymalizator kwerendy będzie wybierz indeks, niezależnie od tego, czy widok odwołuje się z nazwy w kwerendzie.Aby uzyskać więcej informacji, zobacz Rozwiązywanie indeksów dla widoków.

Po instrukcja języka SQL odwołuje się do widoku nieindeksowanych, analizator składni i optymalizator kwerendy analizować źródło instrukcja języka SQL i widok i rozwiązać je do planu jednorazowym.Nie istnieje jeden plan dla instrukcja języka SQL i oddzielne plan dla widoku.

Na przykład rozważmy następujący widok:

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

Na podstawie tego widoku, zarówno tych instrukcji SQL wykonuje te same operacje na tabele bazowe i uzyskać wyniki:

/* 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';

SQL Server Management Studio Showplan funkcji pokazuje, że aparat relacyjny tworzy ten sam plan wykonania dla obu tych instrukcji SELECT.

Przy użyciu wskazówek z widokami

Wskazówki dotyczące serwerów umieszczonych na widoki w kwerendzie może powodować konflikt z innych wskazówek, które zostały wykryte po rozwinięciu widoku do dostępu do jego tabel bazowych.W takim przypadku kwerenda zwraca błąd.Na przykład rozważmy następujący widok, który zawiera wskazówkę tabela w definicji:

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;

Teraz załóżmy, że wprowadzenie tej kwerendy:

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

Kwerenda nie powiedzie się, ponieważ wskazówka SERIALIZABLE stosowanego w widoku Person.AddrState w kwerendzie jest propagowana na obu tabel Person.Address i Person.StateProvince w widoku, gdy jest rozwinięty.Jednakże rozwijanie widoku również ujawnia wskazówka NOLOCK na Person.Address.Ponieważ SERIALIZABLE i NOLOCK wskazówek konfliktu, wynikowa kwerenda jest niepoprawna.

PAGLOCK, NOLOCK, ROWLOCK, TABLOCK lub TABLOCKX tabela wskazówki konfliktu ze sobą, tak jak HOLDLOCK, NOLOCK, parametr READCOMMITTED, REPEATABLEREAD, SERIALIZABLE tabela wskazówki.

Wskazówki można propagować za pośrednictwem poziomów zagnieżdżonych widoki.Załóżmy na przykład, kwerenda stosuje się wskazówka HOLDLOCK w widoku v1.Gdy v1 jest rozwinięta, możemy znaleźć tego widoku v2 jest częścią definicji.v2jego definicja obejmuje NOLOCK wskazówkę na jednym z jego tabel bazowych.Ta tabela również dziedziczy HOLDLOCK wskazówkę dotyczącą kwerendy w widoku, ale v1.Ponieważ NOLOCK i HOLDLOCK wskazówek konfliktu, kwerenda nie powiedzie się.

Wskazówka FORCE ORDER użyto w kwerendzie zawierającej widok kolejność łączyć tabel w widoku zależy od położenia widoku w konstrukcji zamówione.Na przykład poniższa kwerenda wybiera się z trzech tabel i widoku:

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

I View1 jest zdefiniowany, jak pokazano poniżej:

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

The łączyć order in the query plan is Table1, Table2, TableA, TableB, Table3.