Đôi khi, bạn có thể nhận thấy rằng một hoặc nhiều liên kết trong một kế hoạch thực thi được chú thích bằng StarJoinInfo
cấu trúc. Lược đồ kế hoạch chính thức có những điều sau đây để nói về yếu tố kế hoạch này (nhấp để phóng to):
Tài liệu nội dòng được hiển thị ở đó (" thông tin bổ sung về cấu trúc Star Join ") không phải là tất cả những điều đó, mặc dù những chi tiết khác khá hấp dẫn - chúng ta sẽ xem xét những chi tiết này.
Nếu bạn tham khảo công cụ tìm kiếm yêu thích của mình để biết thêm thông tin bằng cách sử dụng các thuật ngữ như “Tối ưu hóa kết hợp sao SQL Server”, bạn có thể thấy kết quả mô tả các bộ lọc bitmap được tối ưu hóa. Đây là một tính năng riêng biệt chỉ dành cho Doanh nghiệp được giới thiệu trong SQL Server 2008 và không liên quan đến StarJoinInfo
cấu trúc nào cả.
Tối ưu hóa cho các Truy vấn Sao có Chọn lọc
Sự hiện diện của StarJoinInfo
chỉ ra rằng SQL Server đã áp dụng một trong số các tối ưu hóa được nhắm mục tiêu vào các truy vấn lược đồ hình sao có chọn lọc. Những tối ưu hóa này có sẵn từ SQL Server 2005, trong tất cả các phiên bản (không chỉ Enterprise). Lưu ý rằng có chọn lọc ở đây đề cập đến số hàng được lấy từ bảng dữ kiện. Sự kết hợp của các vị từ thứ nguyên trong một truy vấn vẫn có thể được chọn lọc ngay cả khi các vị từ riêng lẻ của nó đủ điều kiện cho một số lượng lớn các hàng.
Giao điểm chỉ mục thông thường
Trình tối ưu hóa truy vấn có thể xem xét việc kết hợp nhiều chỉ mục không phân biệt trong đó một chỉ mục duy nhất phù hợp không tồn tại, như truy vấn AdventureWorks sau minh họa:
SELECT COUNT_BIG(*) FROM Sales.SalesOrderHeader WHERE SalesPersonID = 276 AND CustomerID = 29522;
Trình tối ưu hóa xác định rằng việc kết hợp hai chỉ mục không phân biệt (một trên SalesPersonID
và cái khác trên CustomerID
) là cách rẻ nhất để đáp ứng truy vấn này (không có chỉ mục trên cả hai cột):
Mỗi tìm kiếm chỉ mục trả về khóa chỉ mục được phân cụm cho các hàng vượt qua vị từ. Phép nối khớp với các khóa được trả lại để đảm bảo rằng chỉ các hàng khớp với cả hai các vị từ được chuyển sang.
Nếu bảng là một đống, mỗi lần tìm kiếm sẽ trả về các số nhận dạng hàng trong đống (RID) thay vì các khóa chỉ mục được phân cụm, nhưng chiến lược tổng thể giống nhau:tìm các số nhận dạng hàng cho mỗi vị từ, sau đó đối sánh chúng với nhau.
Giao điểm chỉ mục tham gia theo dấu sao thủ công
Ý tưởng tương tự có thể được mở rộng cho các truy vấn chọn hàng từ bảng dữ kiện bằng cách sử dụng các vị từ được áp dụng cho bảng thứ nguyên. Để xem cách này hoạt động như thế nào, hãy xem xét truy vấn sau (sử dụng cơ sở dữ liệu mẫu Contoso BI) để tìm tổng doanh số cho máy nghe nhạc MP3 được bán tại các cửa hàng Contoso với chính xác 50 nhân viên:
SELECT SUM(FS.SalesAmount) FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount = 50 AND DP.ProductName LIKE N'%MP3%';
Để so sánh với những nỗ lực sau này, truy vấn (rất chọn lọc) này tạo ra một kế hoạch truy vấn như sau (nhấp để mở rộng):
Kế hoạch thực hiện đó có chi phí ước tính chỉ hơn 15,6 đơn vị . Nó có tính năng thực thi song song với việc quét toàn bộ bảng dữ kiện (mặc dù có áp dụng bộ lọc bitmap).
Các bảng dữ kiện trong cơ sở dữ liệu mẫu này theo mặc định không bao gồm các chỉ mục không phân biệt trên các khóa ngoại của bảng dữ kiện, vì vậy chúng tôi cần thêm một vài:
CREATE INDEX ix_ProductKey ON dbo.FactSales (ProductKey); CREATE INDEX ix_StoreKey ON dbo.FactSales (StoreKey);
Với các chỉ mục này, chúng ta có thể bắt đầu xem giao điểm chỉ mục có thể được sử dụng như thế nào để cải thiện hiệu quả. Bước đầu tiên là tìm số nhận dạng hàng trong bảng dữ kiện cho từng vị từ riêng biệt. Các truy vấn sau áp dụng một vị từ thứ nguyên, sau đó kết hợp trở lại bảng dữ kiện để tìm số nhận dạng hàng (các khóa chỉ mục nhóm bảng dữ liệu):
-- Product dimension predicate SELECT FS.SalesKey FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey WHERE DP.ProductName LIKE N'%MP3%'; -- Store dimension predicate SELECT FS.SalesKey FROM dbo.FactSales AS FS JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount = 50;
Các kế hoạch truy vấn hiển thị một bản quét bảng thứ nguyên nhỏ, sau đó là tra cứu bằng cách sử dụng chỉ mục phân nhóm bảng dữ kiện để tìm số nhận dạng hàng (hãy nhớ các chỉ mục không phân nhóm luôn bao gồm khóa phân nhóm bảng cơ sở hoặc RID đống):
Giao điểm của hai bộ khóa chỉ mục nhóm bảng dữ kiện này xác định các hàng sẽ được trả về bởi truy vấn ban đầu. Khi chúng tôi có các số nhận dạng hàng này, chúng tôi chỉ cần tra cứu Số tiền bán hàng trong mỗi hàng của bảng dữ kiện và tính tổng.
Truy vấn Giao điểm Chỉ mục Thủ công
Việc gộp tất cả những thứ đó lại với nhau trong một truy vấn sẽ cho kết quả sau:
SELECT SUM(FS.SalesAmount) FROM ( SELECT FS.SalesKey FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey WHERE DP.ProductName LIKE N'%MP3%' INTERSECT -- Store dimension predicate SELECT FS.SalesKey FROM dbo.FactSales AS FS JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount = 50 ) AS Keys JOIN dbo.FactSales AS FS WITH (FORCESEEK) ON FS.SalesKey = Keys.SalesKey OPTION (MAXDOP 1);
FORCESEEK
gợi ý là ở đó để đảm bảo chúng ta có được các tra cứu điểm cho bảng dữ kiện. Nếu không có điều này, trình tối ưu hóa sẽ chọn quét bảng dữ kiện, đó chính là điều chúng tôi đang tìm cách tránh. MAXDOP 1
gợi ý chỉ giúp giữ cho kế hoạch cuối cùng có kích thước khá hợp lý cho mục đích hiển thị (nhấp để xem kích thước đầy đủ):
Các bộ phận thành phần của kế hoạch nút giao chỉ mục thủ công khá dễ xác định. Hai bảng tra cứu chỉ mục không phân biệt bảng dữ kiện ở phía bên phải tạo ra hai bộ số nhận dạng hàng của bảng dữ kiện. Phép nối băm tìm giao điểm của hai tập hợp này. Chỉ mục được phân cụm tìm kiếm trong bảng dữ kiện sẽ tìm Số tiền Bán hàng cho các số nhận dạng hàng này. Cuối cùng, Tổng hợp luồng tính toán tổng số tiền.
Kế hoạch truy vấn này thực hiện tương đối ít tra cứu vào các chỉ mục phân nhóm và phân nhóm của bảng dữ kiện. Nếu truy vấn đủ chọn lọc, đây có thể là một chiến lược thực thi rẻ hơn so với việc quét toàn bộ bảng dữ kiện. Cơ sở dữ liệu mẫu Contoso BI tương đối nhỏ, chỉ có 3,4 triệu hàng trong bảng thông tin bán hàng. Đối với các bảng dữ kiện lớn hơn, sự khác biệt giữa quét toàn bộ và vài trăm lần tra cứu có thể rất đáng kể. Thật không may, phần viết lại thủ công giới thiệu một số lỗi nghiêm trọng về bản số, dẫn đến kế hoạch có chi phí ước tính là 46,5 đơn vị .
Giao điểm chỉ mục kết hợp dấu sao tự động với tra cứu
May mắn thay, chúng tôi không phải quyết định xem truy vấn chúng tôi đang viết có đủ chọn lọc để biện minh cho việc viết lại thủ công này hay không. Tối ưu hóa kết hợp dấu sao cho các truy vấn chọn lọc có nghĩa là trình tối ưu hóa truy vấn có thể khám phá tùy chọn này cho chúng tôi, bằng cách sử dụng cú pháp truy vấn gốc thân thiện với người dùng hơn:
SELECT SUM(FS.SalesAmount) FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount = 50 AND DP.ProductName LIKE N'%MP3%';
Trình tối ưu hóa tạo kế hoạch thực thi sau với chi phí ước tính là 1,64 đơn vị (bấm để phóng to):
Sự khác biệt giữa kế hoạch này và phiên bản thủ công là:giao điểm chỉ mục là một phép nối bên trong thay vì một phép nối bán; và tra cứu chỉ mục theo nhóm được hiển thị dưới dạng Tra cứu khóa thay vì Tìm kiếm chỉ mục theo cụm. Trước nguy cơ khó khăn, nếu bảng dữ kiện là một đống, thì Tra cứu khóa sẽ là Tra cứu RID.
Thuộc tính StarJoinInfo
Các thành viên tham gia gói này đều có StarJoinInfo
cấu trúc. Để xem nó, hãy nhấp vào một trình vòng lặp tham gia và xem trong cửa sổ Thuộc tính SSMS. Nhấp vào mũi tên ở bên trái của StarJoinInfo
để mở rộng nút.
Bảng dữ kiện không phân biệt kết hợp ở bên phải kế hoạch là Tra cứu chỉ mục được xây dựng bởi trình tối ưu hóa:
Tham gia băm có StarJoinInfo
cấu trúc cho thấy nó đang thực hiện Giao điểm chỉ mục (một lần nữa, được tạo ra bởi trình tối ưu hóa):
StarJoinInfo
đối với phép nối Vòng lặp lồng nhau ở ngoài cùng bên trái cho thấy nó được tạo để tìm nạp các hàng của bảng thông tin theo số nhận dạng hàng. Nó nằm ở gốc của cây con tham gia sao do trình tối ưu hóa tạo:
Sản phẩm Descartes và Tra cứu chỉ mục nhiều cột
Các kế hoạch giao điểm chỉ mục được coi là một phần của tối ưu hóa liên kết sao rất hữu ích cho các truy vấn bảng dữ kiện có chọn lọc trong đó các chỉ mục không phân biệt một cột tồn tại trên các khóa ngoại bảng dữ liệu (một phương pháp thiết kế phổ biến).
Đôi khi cũng có ý nghĩa khi tạo chỉ mục nhiều cột trên các khóa ngoại của bảng dữ kiện, cho các kết hợp được truy vấn thường xuyên. Tối ưu hóa truy vấn sao chọn lọc được tích hợp sẵn cũng chứa một đoạn viết lại cho trường hợp này. Để xem cách này hoạt động như thế nào, hãy thêm chỉ mục nhiều cột sau vào bảng dữ kiện:
CREATE INDEX ix_ProductKey_StoreKey ON dbo.FactSales (ProductKey, StoreKey);
Biên dịch lại truy vấn thử nghiệm:
SELECT SUM(FS.SalesAmount) FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount = 50 AND DP.ProductName LIKE N'%MP3%';
Kế hoạch truy vấn không còn có giao điểm chỉ mục (bấm để phóng to):
Chiến lược được chọn ở đây là áp dụng từng vị từ cho các bảng thứ nguyên, lấy tích số của kết quả và sử dụng tích đó để tìm kiếm cả hai khóa của chỉ mục nhiều cột. Sau đó, kế hoạch truy vấn thực hiện Tra cứu khóa vào bảng dữ kiện bằng cách sử dụng số nhận dạng hàng chính xác như đã thấy trước đó.
Kế hoạch truy vấn đặc biệt thú vị bởi vì nó kết hợp ba tính năng thường được coi là Điều tồi tệ (quét toàn bộ, sản phẩm cartesian và tra cứu chính) trong một tối ưu hóa hiệu suất . Đây là một chiến lược hợp lệ khi sản phẩm của hai thứ nguyên được kỳ vọng là rất nhỏ.
Không có StarJoinInfo
đối với sản phẩm của cartesian, nhưng những người tham gia khác không có thông tin (bấm vào để phóng to):
Bộ lọc chỉ mục
Quay lại lược đồ showplan, có một StarJoinInfo
khác hoạt động chúng tôi cần bao gồm:
Index Filter
giá trị được nhìn thấy với các phép nối được coi là đủ chọn lọc để có giá trị thực hiện trước khi tìm nạp bảng dữ kiện. Các phép nối không đủ chọn lọc sẽ được thực hiện sau khi tìm nạp và sẽ không có StarJoinInfo
cấu trúc.
Để xem Bộ lọc chỉ mục bằng cách sử dụng truy vấn thử nghiệm của chúng tôi, chúng tôi cần thêm một bảng nối thứ ba vào hỗn hợp, xóa các chỉ mục bảng dữ kiện không phân biệt đã tạo từ trước đến nay và thêm một bảng mới:
CREATE INDEX ix_ProductKey_StoreKey_PromotionKey ON dbo.FactSales (ProductKey, StoreKey, PromotionKey); SELECT SUM(FS.SalesAmount) FROM dbo.FactSales AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey JOIN dbo.DimPromotion AS DPR ON DPR.PromotionKey = FS.PromotionKey WHERE DS.EmployeeCount = 50 AND DP.ProductName LIKE N'%MP3%' AND DPR.DiscountPercent <= 0.1;
Kế hoạch truy vấn bây giờ là (bấm để phóng to):
Kế hoạch truy vấn giao điểm chỉ mục đống
Để hoàn chỉnh, đây là một tập lệnh để tạo một bản sao đống của bảng dữ kiện với hai chỉ mục không phân biệt cần thiết để cho phép viết lại trình tối ưu hóa giao điểm chỉ mục:
SELECT * INTO FS FROM dbo.FactSales; CREATE INDEX i1 ON dbo.FS (ProductKey); CREATE INDEX i2 ON dbo.FS (StoreKey); SELECT SUM(FS.SalesAmount) FROM FS AS FS JOIN dbo.DimProduct AS DP ON DP.ProductKey = FS.ProductKey JOIN dbo.DimStore AS DS ON DS.StoreKey = FS.StoreKey WHERE DS.EmployeeCount <= 10 AND DP.ProductName LIKE N'%MP3%';
Kế hoạch thực thi cho truy vấn này có các tính năng tương tự như trước đây, nhưng giao điểm chỉ mục được thực hiện bằng cách sử dụng RID thay vì các khóa chỉ mục nhóm bảng dữ liệu và lần tìm nạp cuối cùng là Tra cứu RID (nhấp để mở rộng):
Lời kết
Các bản ghi lại của trình tối ưu hóa được hiển thị ở đây được nhắm mục tiêu vào các truy vấn trả về số lượng hàng tương đối nhỏ từ một lớn bảng dữ kiện. Các bản viết lại này đã có sẵn trong tất cả các phiên bản của SQL Server kể từ năm 2005.
Mặc dù nhằm mục đích tăng tốc các truy vấn lược đồ hình sao (và bông tuyết) có chọn lọc trong kho dữ liệu, trình tối ưu hóa có thể áp dụng các kỹ thuật này ở bất cứ nơi nào phát hiện ra một tập hợp các bảng và liên kết phù hợp. Các phương pháp heuristics được sử dụng để phát hiện các truy vấn dấu sao khá rộng, vì vậy bạn có thể gặp các hình dạng kế hoạch với StarJoinInfo
cấu trúc trong bất kỳ loại cơ sở dữ liệu nào. Bất kỳ bảng nào có kích thước hợp lý (giả sử 100 trang trở lên) có tham chiếu đến các bảng nhỏ hơn (giống thứ nguyên) đều là ứng cử viên tiềm năng cho những tối ưu hóa này (lưu ý rằng các khóa ngoại rõ ràng là không bắt buộc).
Đối với những người trong số các bạn thích những thứ như vậy, quy tắc trình tối ưu hóa chịu trách nhiệm tạo các mẫu nối dấu sao có chọn lọc từ phép nối bảng n hợp lý được gọi là StarJoinToIdxStrategy (sao tham gia vào chiến lược chỉ mục).