Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Số lần xem và số liệu thống kê được lập chỉ mục

Các dạng xem được lập chỉ mục có thể được tạo trong bất kỳ phiên bản SQL Server nào, nhưng có một số hành vi cần lưu ý nếu bạn muốn tận dụng chúng.

Thống kê tự động yêu cầu gợi ý NOEXPAND

SQL Server có thể tạo thống kê tự động để hỗ trợ ước tính bản số và ra quyết định dựa trên chi phí trong quá trình tối ưu hóa truy vấn. Tính năng này hoạt động với các dạng xem được lập chỉ mục cũng như các bảng cơ sở, nhưng chỉ khi dạng xem được đặt tên rõ ràng trong truy vấn và NOEXPAND gợi ý được chỉ định. (Luôn có một đối tượng thống kê được liên kết với mỗi chỉ mục trên một chế độ xem, đó là việc tạo và duy trì tự động các thống kê không được liên kết với một chỉ mục mà chúng ta đang đề cập ở đây.)

Nếu bạn đã quen làm việc với các phiên bản SQL Server không phải Enterprise, bạn có thể chưa bao giờ nhận thấy hành vi này trước đây. Các phiên bản thấp hơn của SQL Server yêu cầu NOEXPAND gợi ý để tạo một kế hoạch truy vấn truy cập một dạng xem được lập chỉ mục. Khi NOEXPAND được chỉ định, thống kê tự động được tạo trên các dạng xem được lập chỉ mục chính xác như xảy ra với các bảng thông thường.

Ví dụ - Phiên bản Tiêu chuẩn với NOEXPAND

Sử dụng SQL Server 2012 Standard Edition và cơ sở dữ liệu mẫu Adventure Works, trước tiên, chúng tôi tạo một dạng xem kết hợp hai bảng bán hàng và tính toán tổng số lượng đặt hàng cho mỗi khách hàng và sản phẩm:

 CREATE VIEW dbo.CustomerOrdersWITH SCHEMABINDING ASSELECT SOH.CustomerID, SOD.ProductID, OrderQty =SUM (SOD.OrderQty), NumRows =COUNT_BIG (*) FROM Sales.SalesOrderDetail AS SODJOIN Sales.SalesOrder ON Seader AS SODJOIN .SalesOrderIDGROUP BY SOH.CustomerID, SOD.ProductID; 

Để chế độ xem này hỗ trợ thống kê, chúng ta cần hiện thực hóa nó bằng cách thêm một chỉ mục được phân nhóm duy nhất. Sự kết hợp giữa Khách hàng và ID sản phẩm được đảm bảo là duy nhất trong chế độ xem (theo định nghĩa), vì vậy chúng tôi sẽ sử dụng đó làm chìa khóa. Chúng tôi có thể chỉ định hai cột theo cách làm tròn trong chỉ mục, nhưng giả sử chúng tôi mong đợi nhiều truy vấn lọc theo sản phẩm hơn, chúng tôi đặt ID sản phẩm làm cột hàng đầu. Hành động này cũng tạo thống kê chỉ mục, với biểu đồ được tạo từ các giá trị ID sản phẩm.

 TẠO cuq CHỈ SỐ ĐƯỢC ĐIỀU CHỈNH DUY NHẤT TRÊN dbo.CustomerOrders (ProductID, CustomerID); 

Bây giờ chúng tôi được yêu cầu viết một truy vấn hiển thị tổng số lượng đơn đặt hàng cho mỗi khách hàng, cho một loạt sản phẩm cụ thể. Chúng tôi kỳ vọng rằng một kế hoạch thực thi sử dụng chế độ xem được lập chỉ mục sẽ là một chiến lược hiệu quả, bởi vì nó sẽ tránh việc kết hợp và hoạt động trên dữ liệu đã được tổng hợp một phần. Vì chúng tôi đang sử dụng SQL Server Standard Edition, chúng tôi phải chỉ định chế độ xem một cách rõ ràng và sử dụng NOEXPAND gợi ý để tạo một kế hoạch truy vấn truy cập chế độ xem được lập chỉ mục:

 CHỌN CO.CustomerID, SUM (CO.OrderQty) TỪ dbo.CustomerOrder AS CO VỚI (NOEXPAND) TRONG ĐÓ CO.ProductID GIỮA 711 VÀ 718GROUP BỞI CO.CustomerID; 

Kế hoạch thực thi được tạo cho thấy một tìm kiếm trên chế độ xem được lập chỉ mục để tìm các hàng cho các sản phẩm quan tâm, sau đó là một tổng hợp để tính tổng số lượng cho mỗi khách hàng:

Chế độ xem Cây kế hoạch của SQL Sentry Plan Explorer cho thấy ước tính số lượng bản chất là chính xác cho tìm kiếm chế độ xem được lập chỉ mục và rất tốt cho kết quả của tổng hợp:

Là một phần của quá trình biên dịch và tối ưu hóa cho truy vấn này, SQL Server đã tạo một đối tượng thống kê bổ sung trên cột ID khách hàng của chế độ xem được lập chỉ mục. Thống kê này được xây dựng bởi vì số lượng dự kiến ​​và phân phối ID khách hàng có thể quan trọng, chẳng hạn như trong việc chọn chiến lược tổng hợp. Chúng tôi có thể xem thống kê mới bằng cách sử dụng Management Studio Object Explorer:

Nhấp đúp vào đối tượng thống kê xác nhận nó được tạo từ cột ID khách hàng trên chế độ xem (không phải bảng cơ sở):

Chế độ xem được lập chỉ mục có thể cải thiện Ước tính số lượng

Vẫn sử dụng Standard Edition, giờ đây chúng tôi thả và tạo lại chế độ xem được lập chỉ mục (cũng làm giảm số liệu thống kê về chế độ xem) và thực hiện lại truy vấn, lần này với NOEXPAND gợi ý đã nhận xét:

 CHỌN CO.CustomerID, SUM (CO.OrderQty) TỪ dbo.CustomerOrders AS CO --WITH (NOEXPAND) TRONG ĐÓ CO.ProductID GIỮA 711 VÀ 718GROUP BỞI CO.CustomerID; 

Như mong đợi khi sử dụng Standard Edition không có NOEXPAND , kế hoạch truy vấn kết quả hoạt động trên các bảng cơ sở thay vì xem trực tiếp:

Tam giác cảnh báo trên toán tử gốc trong kế hoạch ở trên đang cảnh báo chúng tôi về một chỉ mục có thể hữu ích trên bảng Chi tiết Đơn hàng Bán hàng, chỉ mục này không quan trọng đối với mục đích hiện tại của chúng tôi. Việc biên dịch này không tạo ra bất kỳ thống kê nào trên chế độ xem được lập chỉ mục. Thống kê duy nhất về chế độ xem sau khi biên dịch truy vấn là thống kê được liên kết với chỉ mục được phân nhóm:

Chế độ xem Cây kế hoạch cho truy vấn cho thấy ước tính bản số là chính xác cho hai lần quét bảng và phép nối, nhưng hơi tệ hơn một chút đối với các toán tử kế hoạch khác:

Sử dụng chế độ xem được lập chỉ mục với NOEXPAND gợi ý dẫn đến ước tính chính xác hơn cho truy vấn thử nghiệm của chúng tôi vì thông tin chất lượng tốt hơn có sẵn từ thống kê về chế độ xem - đặc biệt là thống kê được liên kết với chỉ mục chế độ xem.

Theo nguyên tắc chung, độ chính xác của thông tin thống kê giảm khá nhanh khi nó đi qua và được sửa đổi bởi các toán tử kế hoạch truy vấn. Các phép nối đơn giản thường không quá tệ về mặt này, nhưng thông tin về kết quả của một phép tổng hợp thường không tốt hơn một phỏng đoán có học. Cung cấp cho trình tối ưu hóa truy vấn thông tin chính xác hơn bằng cách sử dụng số liệu thống kê về các chế độ xem được lập chỉ mục có thể là một kỹ thuật hữu ích để tăng chất lượng và độ mạnh mẽ của kế hoạch.

Chế độ xem không có NOEXPAND có thể tạo ra một kế hoạch kém hơn

Kế hoạch truy vấn được hiển thị ở trên (Phiên bản Tiêu chuẩn, không có NOEXPAND ) thực sự kém tối ưu hơn nếu chúng tôi đã tự viết truy vấn dựa trên các bảng cơ sở, thay vì cho phép trình tối ưu hóa truy vấn mở rộng chế độ xem. Truy vấn bên dưới thể hiện cùng một yêu cầu logic, nhưng không tham chiếu đến chế độ xem:

 CHỌN SOH.CustomerID, SUM (OrderQty) TỪ Sales.SalesOrderHeader AS SOHJOIN Sales.SalesOrderDetail AS SOD TRÊN SOD.SalesOrderID =SOH.SalesOrderIDWHERE SOD.ProductID GIỮA 711 VÀ 718GROUP BỞI SOH.CustomerID; 
 Truy vấn này tạo ra kế hoạch thực thi sau:

Kế hoạch này có một hoạt động tổng hợp ít hơn so với trước đây. Khi mở rộng chế độ xem được sử dụng, trình tối ưu hóa truy vấn rất tiếc không thể loại bỏ hoạt động tổng hợp dư thừa, dẫn đến kế hoạch thực thi kém hiệu quả hơn. Ước tính số lượng cuối cùng cho truy vấn mới cũng tốt hơn một chút so với khi chế độ xem được lập chỉ mục được tham chiếu mà không có NOEXPAND :

Tuy nhiên, các ước tính tốt nhất vẫn là những ước tính được tạo ra khi tham chiếu chế độ xem được lập chỉ mục với NOEXPAND (được lặp lại bên dưới để thuận tiện):

Phiên bản Doanh nghiệp và Chế độ xem Đối sánh

Trên phiên bản Enterprise Edition, trình tối ưu hóa truy vấn có thể sử dụng chế độ xem được lập chỉ mục ngay cả khi truy vấn không đề cập đến chế độ xem một cách rõ ràng. Nếu trình tối ưu hóa có thể đối sánh một phần của cây truy vấn với chế độ xem được lập chỉ mục, nó có thể chọn làm như vậy, dựa trên ước tính của nó về chi phí sử dụng chế độ xem hay không. Logic đối sánh chế độ xem khá thông minh, nhưng nó có những giới hạn khá dễ mắc phải trong thực tế. Ngay cả khi đối sánh chế độ xem thành công, trình tối ưu hóa vẫn có thể bị đánh lừa bởi các ước tính chi phí không chính xác.

Gợi ý truy vấn MỞ RỘNG XEM

Bắt đầu với các khả năng hiếm hơn, có thể có những trường hợp truy vấn tham chiếu đến một dạng xem được lập chỉ mục, nhưng thay vào đó, một kế hoạch tốt hơn sẽ đạt được bằng cách truy cập vào các bảng cơ sở. Trong những trường hợp này, gợi ý truy vấn EXPAND VIEWS có thể được sử dụng:

 CHỌN CO.CustomerID, SUM (CO.OrderQty) TỪ dbo.CustomerOrders AS COWHERE CO.ProductID GIỮA 711 VÀ 718GROUP BỞI CO.CustomerIDOPTION (MỞ RỘNG XEM); 

Trên Phiên bản Doanh nghiệp, truy vấn này tạo ra cùng một kế hoạch như được thấy trên Phiên bản Tiêu chuẩn khi NOEXPAND gợi ý đã bị bỏ qua (bao gồm cả hoạt động tổng hợp dư thừa):

Ngoài ra, EXPAND VIEWS gợi ý được đặt tên kém, theo ý kiến ​​của tôi. SQL Server luôn mở rộng định nghĩa dạng xem trong một truy vấn trừ khi NOEXPAND gợi ý được chỉ định. EXPAND VIEWS gợi ý vô hiệu hóa các quy tắc trong trình tối ưu hóa có thể khớp các phần của cây được mở rộng trở lại chế độ xem được lập chỉ mục. Trong trường hợp không có một trong hai gợi ý, SQL Server trước tiên sẽ mở rộng một chế độ xem với định nghĩa bảng cơ sở của nó, sau đó xem xét việc so khớp trở lại với các chế độ xem được lập chỉ mục. Tên hay hơn cho EXPAND VIEWS gợi ý có thể đã được DISABLE INDEXED VIEW MATCHING , bởi vì đó là những gì nó làm.

EXPAND VIEWS gợi ý có lẽ thường được sử dụng nhất để ngăn một truy vấn chống lại các bảng cơ sở được so khớp với một dạng xem được lập chỉ mục:

 CHỌN SOH.CustomerID, SUM (OrderQty) TỪ Sales.SalesOrderHeader AS SOHJOIN Sales.SalesOrderDetail AS SOD TRÊN SOD.SalesOrderID =SOH.SalesOrderIDWHERE SOD.ProductID GIỮA 711 VÀ 718GROUP THEO SOH.Customer / QUAN ĐIỂM> 

Gợi ý truy vấn dẫn đến cùng một kế hoạch thực thi và các ước tính được thấy khi chúng tôi đang sử dụng Standard Edition và cùng một truy vấn chỉ bảng cơ sở:

Thống kê và Đối sánh Chế độ xem Doanh nghiệp

Ngay cả trong Phiên bản Doanh nghiệp, thống kê chế độ xem không chỉ mục vẫn chỉ được tạo nếu NOEXPAND gợi ý được sử dụng. Để hoàn toàn rõ ràng về điều đó, tính năng đối sánh chế độ xem chỉ dành cho Doanh nghiệp không bao giờ dẫn đến việc tạo hoặc cập nhật thống kê chế độ xem. Hành vi không nhạy cảm này đáng để khám phá một chút, vì nó có thể gây ra những tác dụng phụ đáng ngạc nhiên.

Bây giờ chúng tôi thực hiện truy vấn cơ bản của mình đối với chế độ xem trên phiên bản Enterprise Edition mà không có bất kỳ gợi ý nào:

 CHỌN CO.CustomerID, SUM (CO.OrderQty) TỪ dbo.CustomerOrders AS COWHERE CO.ProductID GIỮA 711 VÀ 718GROUP BỞI CO.CustomerID; 

Một điều mới ở đó là tam giác cảnh báo trên View Clustered Index Seek. Chú giải công cụ hiển thị chi tiết:

Chúng tôi đã không sử dụng NOEXPAND gợi ý, vì vậy thống kê trên cột ID khách hàng của chế độ xem được lập chỉ mục không được tạo tự động. Thống kê về ID khách hàng thực sự không quá quan trọng trong ví dụ đơn giản này, nhưng không phải lúc nào cũng vậy.

Ước tính mật độ tò mò

Điều quan tâm thứ hai là các ước tính về bản số có vẻ kém hơn bất kỳ trường hợp nào mà chúng tôi đã gặp cho đến nay, kể cả các ví dụ về Phiên bản Chuẩn.

Ban đầu, rất khó để biết được ước tính bản số cho Tìm kiếm Chỉ mục Cụm từ Chế độ xem (11,267) đến từ đâu. Chúng tôi hy vọng ước tính sẽ dựa trên thông tin biểu đồ ID sản phẩm từ thống kê được liên kết với chỉ mục nhóm chế độ xem. Phần có liên quan của biểu đồ này được hiển thị bên dưới:

 DBCC SHOW_STATISTICS ('dbo.CustomerOrders', 'cuq') VỚI HISTOGRAM; 

Do bảng chưa được sửa đổi kể từ khi tạo thống kê, chúng tôi mong muốn ước tính là một tổng đơn giản của RANGE_ROWS và EQ_ROWS cho các giá trị ID sản phẩm trong khoảng từ 711 đến 718 (lưu ý rằng ước tính phải loại trừ 28 RANGE_ROWS được hiển thị so với mục nhập 711 vì những hàng đó tồn tại dưới giá trị khóa 711). Tổng của EQ_ROWS được hiển thị là 7,301. Đây chính xác là số hàng được chế độ xem thực sự trả về - vậy ước tính 11.267 đến từ đâu?

Câu trả lời nằm ở cách đối sánh chế độ xem hiện đang hoạt động. Truy vấn của chúng tôi không chỉ định NOEXPAND gợi ý, vì vậy các ước tính số lượng ban đầu dựa trên cây truy vấn mở rộng chế độ xem. Điều này dễ thấy nhất bằng cách xem lại kế hoạch ước tính cho cùng một truy vấn với EXPAND VIEWS chỉ định:

Khu vực tô bóng màu đỏ thể hiện phần cây được thay thế bằng hoạt động đối sánh chế độ xem. Cardinality đầu ra từ khu vực này là 11,267. Phần không bị che khuất với ước tính 11,220 không bị ảnh hưởng bởi đối sánh chế độ xem. Đây chính xác là những ước tính mà chúng tôi đang tìm cách giải thích:

Đối sánh chế độ xem chỉ đơn giản là thay thế vùng bóng mờ màu đỏ bằng một tìm kiếm tương đương về mặt logic trên chế độ xem được lập chỉ mục. Nó không sử dụng thông tin thống kê từ chế độ xem để tính toán lại ước tính bản số.

Ở một mức độ nào đó, bạn có thể đánh giá cao lý do tại sao nó có thể hoạt động theo cách này:nói chung, có rất ít lý do để mong đợi rằng ước tính được tính từ một tập hợp thông tin thống kê tốt hơn bất kỳ tập hợp thông tin thống kê nào. Có thể đặt ra một trường hợp là thống kê chế độ xem được lập chỉ mục có nhiều khả năng chính xác hơn ở đây, so với thống kê dẫn xuất sau kết hợp trong vùng tô bóng màu đỏ, nhưng có thể hơi khó để khái quát điều đó hoặc tính toán chính xác mức độ nhanh chóng của các nguồn khác nhau thông tin thống kê có thể lỗi thời do dữ liệu cơ bản thay đổi.

Người ta cũng có thể lập luận rằng nếu chúng tôi chắc chắn rằng thông tin chế độ xem được lập chỉ mục tốt hơn, chúng tôi đã sử dụng NOEXPAND gợi ý.

Các ước tính về số lượng thậm chí còn tò mò hơn

Một tình huống thú vị hơn nữa nảy sinh với Enterprise Edition nếu chúng tôi viết truy vấn dựa trên các bảng cơ sở và dựa vào đối sánh chế độ xem tự động:

 CHỌN SOH.CustomerID, SUM (OrderQty) TỪ Sales.SalesOrderHeader AS SOHJOIN Sales.SalesOrderDetail AS SOD TRÊN SOD.SalesOrderID =SOH.SalesOrderIDWHERE SOD.ProductID GIỮA 711 VÀ 718GROUP BỞI SOH.CustomerID; 
  

Cảnh báo thống kê mất tích cũng giống như trước đây, và có cùng một lời giải thích. Tính năng thú vị hơn là giờ đây chúng tôi có ước tính thấp hơn cho số hàng được tạo bởi View Clustered Index Seek (7,149) và ước tính tăng lên cho số hàng được trả về từ tổng hợp (8,226).

Để nhấn mạnh điểm này, kế hoạch truy vấn này dường như dựa trên ý tưởng rằng 7.149 hàng nguồn có thể được tổng hợp để tạo ra 8.226 hàng!

Một phần của lời giải thích vẫn giống như trước đây. EXPAND VIEWS kế hoạch truy vấn, hiển thị vùng màu đỏ sẽ được thay thế bằng đối sánh chế độ xem được hiển thị bên dưới:

Điều này giải thích ước tính cuối cùng là 8.226 đến từ đâu, nhưng ước tính hàng 7.149 thì sao? Theo logic đã thấy trước đó, có vẻ như chế độ xem phải hiển thị ước tính 11.267 hàng?

Câu trả lời là ước tính 7.149 chỉ là phỏng đoán. Vâng thật đấy. Chế độ xem được lập chỉ mục chứa tổng cộng 79.433 hàng. Tỷ lệ đoán ma thuật cho vị ngữ ID sản phẩm GIỮA là 9% - cho 0,09 * 79433 =7148,97 hàng. Kế hoạch truy vấn SSMS cho thấy phép tính này chính xác, ngay cả trước khi làm tròn:

Trong tình huống này, trình tối ưu hóa SQL Server dường như ưu tiên phỏng đoán dựa trên số lượng chế độ xem được lập chỉ mục hơn là ước tính số lượng sau kết hợp từ cây con được thay thế. Tò mò.

Tóm tắt

Sử dụng NOEXPAND gợi ý đảm bảo rằng chế độ xem được lập chỉ mục sẽ được sử dụng trong kế hoạch truy vấn cuối cùng và cho phép các thống kê không phải chỉ mục được trình tối ưu hóa truy vấn tự động tạo, duy trì và sử dụng. Sử dụng NOEXPAND cũng đảm bảo các ước tính số lượng ban đầu dựa trên thông tin dạng xem được lập chỉ mục thay vì được lấy từ các bảng cơ sở.

Nếu NOEXPAND không được chỉ định, các tham chiếu dạng xem luôn được thay thế bằng các định nghĩa bảng cơ sở của chúng trước khi bắt đầu biên dịch truy vấn (và do đó trước khi ước lượng bản số ban đầu). Chỉ trong Enterprise SKU, các chế độ xem được lập chỉ mục có thể được thay thế trở lại cây truy vấn sau này trong quá trình tối ưu hóa.

EXPAND VIEWS gợi ý truy vấn ngăn trình tối ưu hóa thực hiện đối sánh chế độ xem được lập chỉ mục của Phiên bản Doanh nghiệp. Điều này áp dụng cho dù truy vấn ban đầu tham chiếu đến một dạng xem được lập chỉ mục hay không. Khi đối sánh chế độ xem được thực hiện, ước tính bản số hiện có có thể được thay thế bằng phỏng đoán trong một số trường hợp.

Thống kê được hiển thị bị thiếu trên chế độ xem được lập chỉ mục có thể được tạo theo cách thủ công, nhưng trình tối ưu hóa nói chung sẽ không sử dụng chúng cho các truy vấn không sử dụng NOEXPAND gợi ý.

Sử dụng các chế độ xem được lập chỉ mục có thể cải thiện ước tính số lượng, đặc biệt nếu chế độ xem chứa các phép nối hoặc tổng hợp. Truy vấn có cơ hội tốt nhất để hưởng lợi từ thống kê chế độ xem chính xác hơn nếu NOEXPAND được chỉ định.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mức lương trung bình của một nhà phát triển SQL là gì?

  2. Bắt đầu với Cloud Firestore cho iOS

  3. Thông tin liên hệ đang phát triển có nghĩa là thay đổi cơ sở dữ liệu của bạn không?

  4. Cách cài đặt Nextcloud 15 trên Ubuntu 18.04

  5. Kiểm tra tác động hiệu suất của khối lượng công việc Adhoc