Tóm lại
Những yếu tố nào đi vào họ truy vấn lựa chọn của trình tối ưu hóa chỉ mục của chế độ xem được lập chỉ mục?
Đối với tôi, các chế độ xem được lập chỉ mục dường như thách thức những gì tôi hiểu về cách Trình tối ưu hóa chọn chỉ mục. Tôi đã thấy điều này được hỏi trước đây , nhưng OP không được đón nhận. Tôi thực sự đang tìm kiếm các hướng dẫn , nhưng tôi sẽ đưa ra một ví dụ giả, sau đó đăng ví dụ thực tế với rất nhiều DDL, đầu ra, ví dụ.
Giả sử tôi đang sử dụng Enterprise 2008+, hiểu
with(noexpand)
Ví dụ giả
Lấy ví dụ giả này: Tôi tạo một chế độ xem với 22 liên kết, 17 bộ lọc và một con ngựa xiếc vượt qua một loạt các bảng 10 triệu hàng. Quan điểm này là Đắt (yep, với số vốn E) để hiện thực hóa. Tôi sẽ SCHEMABIND và lập chỉ mục cho quan điểm. Thì a SELECT a,b FROM AnIndexedView WHERE theClusterKeyField < 84
. Trong logic Trình tối ưu hóa giúp tôi thực hiện các phép nối cơ bản được thực hiện.
Kết quả:
- Không có gợi ý: 4825 đọc cho 720 hàng, 47 cpu trên 76ms và chi phí cây con ước tính là 0,30523.
- Với Gợi ý: 17 lần đọc, 720 hàng, 15 cpu trên 4ms và chi phí phụ ước tính là 0,007253
Vậy chuyện gì đang xảy ra ở đây? Tôi đã thử nó trong Enterprise 2008, 2008-R2 và 2012. Theo mọi số liệu tôi có thể nghĩ rằng việc sử dụng chỉ mục của chế độ xem hiệu quả hơn rất nhiều. Tôi không có vấn đề đánh hơi thông số hoặc dữ liệu sai lệch, vì đây là quảng cáo.
Một ví dụ thực tế (dài)
Trừ khi bạn là một kẻ bạo dâm, có lẽ bạn không cần hoặc không muốn đọc phần này.
Phiên bản
Yep, doanh nghiệp.
Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 10 tháng 2 năm 2012 19:39:15 Bản quyền (c) Microsoft Corporation Enterprise Edition (64-bit) trên Windows NT 6.2 (Build 9200 :) (Hypervisor)
Cái nhìn
CREATE VIEW dbo.TimelineMaterialized WITH SCHEMABINDING
AS
SELECT TM.TimelineID,
TM.TimelineTypeID,
TM.EmployeeID,
TM.CreateUTC,
CUL.CultureCode,
CASE
WHEN TM.CustomerMessageID > 0 THEN TM.CustomerMessageID
WHEN TM.CustomerSessionID > 0 THEN TM.CustomerSessionID
WHEN TM.NewItemTagID > 0 THEN TM.NewItemTagID
WHEN TM.OutfitID > 0 THEN TM.OutfitID
WHEN TM.ProductTransactionID > 0 THEN TM.ProductTransactionID
ELSE 0 END As HrefId,
CASE
WHEN TM.CustomerMessageID > 0 THEN IsNull(C.Name, 'N/A')
WHEN TM.CustomerSessionID > 0 THEN IsNull(C.Name, 'N/A')
WHEN TM.NewItemTagID > 0 THEN IsNull(NI.Title, 'N/A')
WHEN TM.OutfitID > 0 THEN IsNull(O.Name, 'N/A')
WHEN TM.ProductTransactionID > 0 THEN IsNull(PT_PL.NameLocalized, 'N/A')
END as HrefText
FROM dbo.Timeline TM
INNER JOIN dbo.CustomerSession CS ON TM.CustomerSessionID = CS.CustomerSessionID
INNER JOIN dbo.CustomerMessage CM ON TM.CustomerMessageID = CM.CustomerMessageID
INNER JOIN dbo.Outfit O ON PO.OutfitID = O.OutfitID
INNER JOIN dbo.ProductTransaction PT ON TM.ProductTransactionID = PT.ProductTransactionID
INNER JOIN dbo.Product PT_P ON PT.ProductID = PT_P.ProductID
INNER JOIN dbo.ProductLang PT_PL ON PT_P.ProductID = PT_PL.ProductID
INNER JOIN dbo.Culture CUL ON PT_PL.CultureID = CUL.CultureID
INNER JOIN dbo.NewsItemTag NIT ON TM.NewsItemTagID = NIT.NewsItemTagID
INNER JOIN dbo.NewsItem NI ON NIT.NewsItemID = NI.NewsItemID
INNER JOIN dbo.Customer C ON C.CustomerID = CASE
WHEN TM.TimelineTypeID = 1 THEN CM.CustomerID
WHEN TM.TimelineTypeID = 5 THEN CS.CustomerID
ELSE 0 END
WHERE CUL.IsActive = 1
Chỉ số cụm
CREATE UNIQUE CLUSTERED INDEX PK_TimelineMaterialized ON
TimelineMaterialized (EmployeeID, CreateUTC, CultureCode, TimelineID)
Kiểm tra SQL
-- NO HINT - - - - - - - - - - - - - - -
SELECT * --yes yes, star is bad ...just a test example
FROM TimelineMaterialized TM
WHERE
TM.EmployeeID = 2
AND TM.CultureCode = 'en-US'
AND TM.CreateUTC > '9/10/2012'
AND TM.CreateUTC < '9/11/2012'
-- WITH HINT - - - - - - - - - - - - - - -
SELECT *
FROM TimelineMaterialized TM with(noexpand)
WHERE
TM.EmployeeID = 2
AND TM.CultureCode = 'en-US'
AND TM.CreateUTC > '9/10/2012'
AND TM.CreateUTC < '9/11/2012'
Kết quả = 11 hàng đầu ra
Profiler Output
4 dòng trên cùng không có gợi ý. 4 dòng dưới cùng đang sử dụng gợi ý.
Kế hoạch thực hiện
GitHub Gist cho cả hai Kế hoạch thực hiện ở định dạng SQLPlan
Không có kế hoạch Thực hiện Gợi ý - tại sao không sử dụng chỉ mục cụm mà tôi đã cung cấp cho bạn SQL? Đó là clusterd trên 3 trường bộ lọc. Hãy thử nó, bạn có thể thích nó.
Kế hoạch đơn giản khi sử dụng một gợi ý.