Sử dụng các khung nhìn được lập chỉ mục cho tổng hợp - quá tốt là đúng?


28

Chúng tôi có kho dữ liệu với số lượng bản ghi khá lớn (10-20 triệu hàng) và thường chạy các truy vấn đếm các bản ghi giữa các ngày nhất định hoặc đếm các bản ghi với các cờ nhất định, ví dụ:

SELECT
    f.IsFoo,
    COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
    ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo

Hiệu suất không tệ, nhưng có thể tương đối chậm chạp (có thể là 10 giây trên bộ đệm lạnh).

Gần đây tôi phát hiện ra rằng tôi có thể sử dụng GROUP BYtrong các chế độ xem được lập chỉ mục và vì vậy đã thử một cái gì đó tương tự như sau

CREATE VIEW TestView
WITH SCHEMABINDING
AS
    SELECT
        Date,
        FlagId,
        COUNT_BIG(*) AS WidgetCount
    FROM Widgets
    GROUP BY Date, FlagId;
GO

CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
    Date,
    FlagId
);

Do đó, hiệu suất của truy vấn đầu tiên của tôi hiện là <100ms và chế độ xem & chỉ mục kết quả là <100k (mặc dù số lượng hàng của chúng tôi lớn, phạm vi ngày và ID cờ có nghĩa là chế độ xem này chỉ chứa 1000-2000 hàng).

Tôi nghĩ rằng có lẽ điều này sẽ làm giảm hiệu suất ghi vào bảng Widget, nhưng không - hiệu suất của việc chèn và cập nhật vào bảng này không bị ảnh hưởng nhiều như tôi có thể nói (cộng với, là kho dữ liệu mà bảng này được cập nhật không thường xuyên dù sao)

Đối với tôi, điều này dường như quá tốt để trở thành sự thật - phải không? Tôi cần phải cẩn thận khi sử dụng các chế độ xem được lập chỉ mục theo cách này?


2
Bạn có thể viết lại tập lệnh của mình để chúng thực sự hợp lệ không? Của bạn SELECTCREATE VIEWkịch bản là sai, vì tôi tin là CREATE INDEXkịch bản của bạn .
Mark Sinkinson

2
@MarkSinkinson Xin lỗi, hóa ra việc cố gắng viết SQL hợp lệ cho các bảng tưởng tượng là khó khăn
Justin

Phần 'quá tốt là đúng' đối với tôi xuất hiện khi tôi muốn các chế độ xem nâng cao hơn, chẳng hạn như các chế độ chứa MAX, tự tham gia hoặc tham gia bên ngoài hoặc lập chỉ mục một chế độ xem tham chiếu một chế độ xem khác - tất cả đều có trong SQL Server cho phép docs.microsoft.com/en-us/sql/relational-database/view/iêu . Vì vậy, tôi luôn luôn nhận được quá nhiều tham vọng và sau đó phải thu nhỏ lại mọi thứ. Nhưng đối với các tập hợp đơn giản hơn, chúng thực sự tuyệt vời - thậm chí SUM được hỗ trợ.
Simon_Weaver

Câu trả lời:


29

Như bạn đã lưu ý, bản thân chế độ xem chỉ cụ thể hóa một số lượng nhỏ hàng - vì vậy ngay cả khi bạn cập nhật toàn bộ bảng, I / O bổ sung liên quan đến cập nhật chế độ xem là không đáng kể. Có lẽ bạn đã cảm thấy nỗi đau lớn nhất mà bạn sẽ cảm thấy khi bạn tạo chế độ xem. Lần gần nhất tiếp theo sẽ là nếu bạn thêm một hàng gazillion vào bảng cơ sở với một loạt ID mới yêu cầu các hàng mới trong dạng xem.

Điều này không quá tốt để trở thành sự thật. Bạn đang sử dụng các chế độ xem được lập chỉ mục chính xác cách chúng được sử dụng - hoặc ít nhất một trong những cách hiệu quả nhất: trả tiền cho các tập hợp truy vấn trong tương lai tại thời điểm viết. Điều này hoạt động tốt nhất khi kết quả nhỏ hơn nhiều so với nguồn và tất nhiên khi các tập hợp được yêu cầu thường xuyên hơn so với dữ liệu cơ bản được cập nhật (nói chung là phổ biến hơn trong DW so với OLTP).

Thật không may, nhiều người nghĩ rằng lập chỉ mục một chế độ xem là kỳ diệu - một chỉ mục sẽ không làm cho tất cả các chế độ xem hiệu quả hơn, đặc biệt là các chế độ xem chỉ đơn giản là tham gia các bảng và / hoặc tạo ra cùng số lượng hàng như nguồn (hoặc thậm chí nhân lên). Trong các trường hợp này, I / O từ chế độ xem giống hoặc thậm chí tệ hơn truy vấn ban đầu, không chỉ vì có cùng hoặc nhiều hàng, mà thường chúng cũng được lưu trữ và cụ thể hóa nhiều cột hơn. Vì vậy, việc cụ thể hóa những thứ trước không mang lại bất kỳ lợi ích nào, vì - ngay cả với SSD - I / O, mạng và xử lý / kết xuất máy khách vẫn là nút thắt chính trong việc trả lại kết quả lớn cho máy khách. Khoản tiết kiệm bạn có được để tránh việc tham gia trong thời gian chạy không thể đo lường được so với tất cả các tài nguyên khác mà bạn vẫn đang sử dụng.

Giống như các chỉ mục không được nhóm, chỉ cần cẩn thận để không làm quá nó. Nếu bạn thêm 10 chế độ xem được lập chỉ mục khác nhau vào một bảng, bạn sẽ thấy tác động nhiều hơn đến phần ghi của khối lượng công việc của bạn, đặc biệt nếu (các) cột nhóm không (trong) khóa phân cụm.

Trời ạ, tôi đã có ý định viết blog về chủ đề này.


19

Aarons câu trả lời bao gồm câu hỏi này tốt. Hai điều cần thêm:

  1. Các khung nhìn được lập chỉ mục tổng hợp có thể dẫn đến sự tranh chấp giữa các hàng và các bế tắc. Thông thường, hai chèn không bế tắc (ngoại trừ các điều kiện khá hiếm gặp như leo thang khóa hoặc va chạm băm khóa). Nhưng nếu cả hai chèn địa chỉ cùng một nhóm trong chế độ xem, họ sẽ tranh luận. Điểm giống nhau là viết tắt của bất kỳ thứ gì khác có khóa (DML, gợi ý khóa).
  2. Các khung nhìn được lập chỉ mục không tổng hợp cũng có thể hữu ích. Chúng cho phép bạn lập chỉ mục trên các cột từ nhiều bảng. Bằng cách đó, bạn có thể lọc hiệu quả trên một bảng và sắp xếp theo một cột từ một bảng đã nối. Mẫu đó có thể chuyển đổi tham gia toàn bảng thành các truy vấn nhỏ liên tục.

Tôi đã sử dụng cả tổng hợp và tham gia quan điểm với lợi ích cực kỳ.

Tất cả trong tất cả các trường hợp sử dụng của bạn có vẻ như một trường hợp hoàn hảo. Lượt xem được lập chỉ mục là một kỹ thuật không được sử dụng đúng mức.

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.