Có cách nào để đưa ra kết quả với chính xác 3 hướng dẫn riêng biệt và không còn nữa không? Tôi hy vọng có thể trả lời tốt hơn các câu hỏi trong tương lai bằng cách bao gồm các hướng dẫn kế hoạch với các truy vấn loại CTE được tham chiếu nhiều lần để vượt qua một số yêu cầu CTE của SQL Server.
Không phải hôm nay. Các biểu thức bảng chung không đệ quy (CTE) được coi là các định nghĩa khung nhìn nội tuyến và được mở rộng thành cây truy vấn logic tại mỗi nơi chúng được tham chiếu (giống như các định nghĩa khung nhìn thông thường) trước khi tối ưu hóa. Cây logic cho truy vấn của bạn là:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Lưu ý hai View View Neo và sáu lệnh gọi đến hàm nội tại newid
trước khi bắt đầu tối ưu hóa. Tuy nhiên, nhiều người cho rằng trình tối ưu hóa phải có khả năng xác định rằng các cây con mở rộng ban đầu chỉ là một đối tượng được tham chiếu và đơn giản hóa theo. Cũng đã có một số yêu cầu kết nối để cho phép cụ thể hóa rõ ràng CTE hoặc bảng dẫn xuất.
Một triển khai tổng quát hơn sẽ có trình tối ưu hóa xem xét cụ thể hóa các biểu thức phổ biến tùy ý để cải thiện hiệu suất ( CASE
với một truy vấn con là một ví dụ khác mà các vấn đề có thể xảy ra ngày hôm nay). Microsoft Research đã xuất bản một bài báo (PDF) vào năm 2007, mặc dù cho đến nay nó vẫn chưa được thực hiện. Hiện tại, chúng tôi bị giới hạn trong việc cụ thể hóa rõ ràng bằng cách sử dụng những thứ như biến bảng và bảng tạm thời.
SQLKiwi đã đề cập đến việc lên kế hoạch trong SSIS, có cách nào hoặc công cụ hữu ích để hỗ trợ đưa ra một kế hoạch tốt cho SQL Server không?
Đây chỉ là mơ tưởng của tôi, và vượt xa ý tưởng sửa đổi hướng dẫn kế hoạch. Về nguyên tắc, có thể viết một công cụ để thao tác trực tiếp với kế hoạch XML, nhưng nếu không có công cụ tối ưu hóa cụ thể bằng cách sử dụng công cụ này có thể sẽ là một trải nghiệm khó chịu cho người dùng (và nhà phát triển nghĩ về nó).
Trong bối cảnh cụ thể của câu hỏi này, một công cụ như vậy vẫn không thể cụ thể hóa nội dung CTE theo cách mà nhiều người tiêu dùng có thể sử dụng (để cung cấp cả hai đầu vào cho tham gia chéo trong trường hợp này). Trình tối ưu hóa và công cụ thực thi hỗ trợ các cuộn nhiều người tiêu dùng, nhưng chỉ cho các mục đích cụ thể - không ai trong số đó có thể được thực hiện để áp dụng cho ví dụ cụ thể này.
Mặc dù tôi không chắc chắn, tôi có linh cảm khá mạnh mẽ rằng RelOps có thể được theo dõi (Nested Loop, Lazy Spool) ngay cả khi truy vấn không hoàn toàn giống như kế hoạch - ví dụ: nếu bạn đã thêm 4 và 5 vào CTE , nó vẫn tiếp tục sử dụng cùng một kế hoạch (dường như - đã được thử nghiệm trên SQL Server 2012 RTM Express).
Có một lượng linh hoạt hợp lý ở đây. Hình dạng rộng của kế hoạch XML được sử dụng để hướng dẫn tìm kiếm kế hoạch cuối cùng (mặc dù nhiều thuộc tính bị bỏ qua hoàn toàn, ví dụ như loại phân vùng trên các trao đổi) và các quy tắc tìm kiếm thông thường cũng được nới lỏng đáng kể. Ví dụ, việc cắt tỉa sớm các lựa chọn thay thế dựa trên các cân nhắc về chi phí bị vô hiệu hóa, việc giới thiệu rõ ràng các phép nối chéo được cho phép và các thao tác vô hướng bị bỏ qua.
Có quá nhiều chi tiết để đi sâu, nhưng vị trí của Bộ lọc và Tính toán vô hướng không thể bị ép buộc và các vị từ của biểu mẫu column = value
được khái quát hóa để một kế hoạch có chứa X = 1
hoặc X = @X
có thể được áp dụng cho truy vấn có chứa X = 502
hoặcX = @Y
. Sự linh hoạt đặc biệt này có thể giúp rất nhiều trong việc tìm kiếm một kế hoạch tự nhiên để buộc.
Trong ví dụ cụ thể, liên tục All All luôn có thể được triển khai dưới dạng Quét liên tục; số lượng đầu vào cho Liên minh Tất cả không thành vấn đề.