Tôi có một cái bàn với vài chục hàng. Thiết lập đơn giản là sau
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
Và tôi có một truy vấn nối bảng này với một tập hợp các hàng được xây dựng giá trị bảng (được tạo bởi các biến và hằng), như
DECLARE @id1 int = 101, @id2 int = 105;
SELECT
COALESCE(p.[Code], 'X') AS [Code],
COALESCE(d.[Status], 0) AS [Status]
FROM (VALUES
(@id1, 'A'),
(@id2, 'B')
) p([Id], [Code])
FULL JOIN #data d ON d.[Id] = p.[Id];
Kế hoạch thực hiện truy vấn đang cho thấy quyết định của trình tối ưu hóa là sử dụng FULL LOOP JOIN
chiến lược, điều này có vẻ phù hợp, vì cả hai đầu vào đều có rất ít hàng. Tuy nhiên, một điều tôi nhận thấy (và không thể đồng ý) là các hàng TVC đang được lưu trữ (xem khu vực của kế hoạch thực hiện trong hộp màu đỏ).
Tại sao trình tối ưu hóa giới thiệu spool ở đây, lý do để làm điều đó là gì? Không có gì phức tạp ngoài ống chỉ. Hình như không cần thiết. Làm thế nào để thoát khỏi nó trong trường hợp này, những cách có thể là gì?
Kế hoạch trên đã đạt được trên
Máy chủ Microsoft SQL 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)