Những yếu tố nào được đưa vào Chỉ mục cụm của Chế độ xem được chọn?


19

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

11 hàng đầu ra - giống nhau cho cả hai truy vấn

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 ý.

Hồ sơ

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ó.
Không có gợi ý - kế hoạch thực hiện khổng lồ

Kế hoạch đơn giản khi sử dụng một gợi ý.

Sử dụng Gợi ý - Kế hoạch thực hiện đơn giản


Câu trả lời:


26

Khớp các khung nhìn được lập chỉ mục là một hoạt động tương đối tốn kém *, vì vậy trình tối ưu hóa thử các biến đổi nhanh chóng và dễ dàng khác trước. Nếu những điều đó xảy ra để tạo ra một kế hoạch giá rẻ (0,05 đơn vị trong trường hợp của bạn) thì việc kết thúc sớm. Đặt cược là việc tối ưu hóa liên tục sẽ tiêu tốn nhiều thời gian hơn mức tiết kiệm. Hãy nhớ mục tiêu chính của trình tối ưu hóa là một kế hoạch 'đủ tốt' một cách nhanh chóng.

Bản thân việc sử dụng chỉ mục được nhóm trên chế độ xem không tốn kém, nhưng quá trình khớp cây truy vấn logic với các chế độ xem được lập chỉ mục tiềm năng có thể. Như tôi đã đề cập trong một nhận xét cho câu hỏi khác, tham chiếu chế độ xem trong truy vấn được mở rộng trước khi tối ưu hóa, vì vậy trình tối ưu hóa không biết bạn đã viết truy vấn đối với chế độ xem ở vị trí đầu tiên - nó chỉ nhìn thấy cây được mở rộng (như thể quan điểm đã được xếp hàng).

"Kế hoạch đủ tốt" có nghĩa là trình tối ưu hóa đã tìm thấy một kế hoạch tốt và dừng lại sớm trong giai đoạn thăm dò. "TimeOut" có nghĩa là nó vượt quá số bước tối ưu hóa mà nó tự đặt là 'ngân sách' khi bắt đầu giai đoạn hiện tại.

Ngân sách được đặt dựa trên chi phí của kế hoạch tốt nhất được tìm thấy trong giai đoạn trước. Với truy vấn chi phí thấp như vậy (0,05), số lần di chuyển được ngân sách sẽ khá nhỏ và nhanh chóng cạn kiệt bởi chuyển đổi thường xuyên với số lượng liên kết tham gia vào truy vấn mẫu của bạn (ví dụ: có rất nhiều cách để sắp xếp lại các liên kết bên trong) .

Nếu bạn quan tâm để biết thêm về lý do tại sao xem phù hợp được lập chỉ mục là tốn kém, và do đó để lại cho giai đoạn sau của tối ưu hóa và / hoặc chỉ xem xét cho các truy vấn tốn kém hơn, có hai công trình nghiên cứu của Microsoft về chủ đề ở đây (pdf) và đây (CiteSeer ).

Một yếu tố liên quan khác là kết hợp chế độ xem được lập chỉ mục không khả dụng trong giai đoạn tối ưu hóa 0 (xử lý giao dịch).

Đọc thêm:

Lượt xem và thống kê được lập chỉ mục

* và chỉ khả dụng trong Phiên bản doanh nghiệp (hoặc tương đương)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.