2016-04-01 18 views
1

Dizine eklenmiş bir görünümün performansını test ediyorum. Aşağıda kullandığım kodlar. AdventureWorks2012 Veritabanı kullanıyorum.İndeksli görünüm neden performansı artırmıyor?

--sonuç Test tabloları

tablolarda
SELECT * 
    INTO Person.Person_Test 
    FROM [Person].[Person] 
    go 
    SELECT * 
    INTO Person.PersonPhone_Test 
    FROM [Person].[PersonPhone] 
    go 
    SELECT * 
    INTO Person.BusinessEntityAddress_Test 
    FROM [Person].BusinessEntityAddress 
    go 
    SELECT * 
    INTO Person.Address_Test 
    FROM [Person].Address 
    go 

SET STATISTICS IO ON 
SET STATISTICS TIME ON 

--sonuç endeksler görünüşüdür

CREATE VIEW My_View WITH SCHEMABINDING AS 
     SELECT P.BusinessEntityID,P.FirstName,P.LastName, PH.PhoneNumber,PH.PhoneNumberTypeID,BU.AddressID,AD.AddressLine1 
     FROM Person.Person_Test P 
     INNER JOIN Person.PersonPhone_Test PH 
     ON P.BusinessEntityID=PH.BusinessEntityID 
     INNER JOIN Person.BusinessEntityAddress_Test BU 
     ON P.BusinessEntityID=BU.BusinessEntityID 
     INNER JOIN Person.Address_Test AD 
     ON BU.AddressID=AD.AddressID 
     WHERE P.BusinessEntityID BETWEEN 50 AND 10000 AND AD.AddressID BETWEEN 100 AND 1000 
    GO 

sonra dört masa göre --sonuç

CREATE CLUSTERED INDEX Person1 ON Person.Person_Test (BusinessEntityID); 
CREATE CLUSTERED INDEX PersonPhone1 ON Person.PersonPhone_Test (BusinessEntityID); 
CREATE CLUSTERED INDEX BusEntity1 ON Person.BusinessEntityAddress_Test (BusinessEntityID); 
CREATE INDEX BusEntity2 ON Person.BusinessEntityAddress_Test (AddressId); 
CREATE CLUSTERED INDEX AddressInd1 ON Person.Address_Test (AddressId); 

I testi dizinsiz performans (Query1)

--Test regular view 
SELECT BusinessEntityID,LastName,PhoneNumber,AddressID, AddressLine1 
FROM My_View 
WHERE BusinessEntityID between 50 and 200 

aldım mesajım: 1. Ben de eklemek yukarıdaki Sorgu yeniden çalıştırın

SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 8 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

(91 row(s) affected) 
Table 'Address_Test'. Scan count 91, logical reads 185, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'PersonPhone_Test'. Scan count 91, logical reads 184, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Person_Test'. Scan count 91, logical reads 286, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'BusinessEntityAddress_Test'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 1 ms. 

Sonra ben de aynı mesajı aldı,

CREATE UNIQUE CLUSTERED INDEX idx_MyView ON My_View(BusinessEntityID); 
go 

Ancak görünümde endeksi eklemek Yürütme planı burada. Görünüm dizine eklendiğinde veya dizine eklenmediğinde, Yürütme planlarının ikisi de aynıdır. enter image description hereenter image description here

Kaçırdığım bir şey var mı? Görünüme dizin ekledikten sonra performans neden aynı?

+1

Dizinleri masaya bırakın ve sınamasını tekrar yapın. planınızda tüm işlemler index_seek kullanıyor. SQL, tablolarda dizinleri kullanıyor, bu yüzden görünümünüzde dizin olup olmadığını farketmez. optimize edicinin çok akıllı olduğunu unutmayın.yine de, dba sitesinde yayınlarsanız daha iyi cevap alabilirsiniz. http://dba.stackexchange.com – FLICKER

+0

Hangi sürüm os sql-server? Standart veya Kurumsal? Sorguyu, queryhint NOEXPAND ile çalıştırmayı düşünün. – mxix

+0

@mxix Haklısınız. NOEXPAND bana başka bir mesaj veriyor. – NewGuyComesIn

cevap

2

Görünüm koşulu, sorgu koşulundan daha kısıtlayıcıdır. Görünümün gerekenden daha az veri var.

WHERE P.BusinessEntityID BETWEEN 50 AND 10000 AND AD.AddressID BETWEEN 100 AND 1000 

vs yani sabittir endeksli görünüm eşleştirme çok kırılgan olduğunu ve başarısız olabilir Hatta

WHERE BusinessEntityID between 50 and 200 

. NOEXPAND kullanarak zorlamak gerekebilir.

+0

Açıklama için teşekkürler. – NewGuyComesIn

1

@mxix sayesinde. NOEXPAND bana yeni bir mesaj veriyor.

SELECT BusinessEntityID,LastName,PhoneNumber,AddressID, AddressLine1 
FROM My_View WITH (NOEXPAND) 
WHERE BusinessEntityID between 50 and 200; 
go 

mesajı:

SQL Server parse and compile time: 
     CPU time = 0 ms, elapsed time = 0 ms. 
    SQL Server parse and compile time: 
     CPU time = 0 ms, elapsed time = 0 ms. 

(91 row(s) affected) 
Table 'My_View'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 

enter image description here @FLICKER de bu doğru iyileştirici çok akıllı. anahtar nokta üzerinden


@usr sayı.

NOEXPAND belirtmem gerekmiyor. SQL Server, indeksi otomatik olarak kullanır.

SQL Server parse and compile time: 
    CPU time = 15 ms, elapsed time = 16 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

(129 row(s) affected) 
Table 'My_View'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
+0

Bu, farklı filtre kümeleriyle farklı bir sorgu değil. – usr