Cách hiệu quả nhất để so sánh hai tập kết quả lớn trong SQL Server 2012 là gì


9

Lời khuyên hiện tại cho cách hiệu quả nhất để so sánh hai tập kết quả / hàng lớn dường như là sử dụng EXCEPTtoán tử. Tập lệnh SQL tự chứa bên dưới này rất kém hiệu quả khi kích thước hàng tăng (thay đổi giá trị @last). Tôi đã cố gắng tìm các mục duy nhất trong một bảng kết hợp nhưng không có cải thiện.

DECLARE @first AS INT, @step AS INT, @last AS INT; 

-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible

-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)

DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END

DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END

select * from @temptableNEW
except
select * from @temptableOLD

Câu trả lời:


8

EXCEPTngụ ý một DISTINCThoạt động.

Tôi sẽ sử dụng NOT EXISTSnếu điều này không thực sự cần thiết.

Tuy nhiên, vấn đề bạn gặp phải có khả năng là bạn đang có một vòng lặp lồng nhau trên một bảng chưa được tìm thấy do các ước tính về số lượng thẻ kém liên quan đến các biến của bảng.

select * from @temptableNEW
except
select * from @temptableOLD
OPTION (RECOMPILE)

Sẽ có thể tính đến việc các bảng có mỗi hàng 100K và đưa ra một kế hoạch khác nhau.

Trong SQL Server 2012, bạn chỉ có thể thêm các chỉ mục vào các biến của bảng thông qua các ràng buộc. Nếu các giá trị là duy nhất bạn có thể sử dụng

DECLARE @temptableOLD TABLE ([Result1] int UNIQUE CLUSTERED);

để thêm một chỉ mục. Nếu được thực hiện trên cả hai bảng, kế hoạch (sau khi gợi ý biên dịch lại được thêm vào) có thể sẽ sử dụng phép nối hợp nhất thay thế. Nếu không có bất kỳ chỉ mục nào, tôi sẽ mong đợi một tham gia băm.


Cảm ơn Martin. Đây là câu trả lời. TÙY CHỌN (RECOMPILE) đã giúp (100.000 trong 5 phút), nhưng UNIITE CLUSTERED trên cả hai bảng đã tạo ra sự cải thiện lớn (100.000 trong 7 giây !!!). Tôi chỉ tạo các bảng này để chứng minh một vấn đề thực tế trong cuộc sống khi tôi không kiểm soát việc lập chỉ mục bảng trên hai máy chủ SQL khác nhau, nhưng tôi sẽ quản lý nó thông qua các biến bảng như vậy.
Willleyley

4
Các #tempbảng @WillHealey có rất nhiều lợi thế so với các biến của bảng (thống kê, song song, lập chỉ mục linh hoạt hơn) vì vậy nếu bạn không sử dụng điều này trong bối cảnh bạn bị giới hạn ở các biến Bảng, bạn cũng có thể thử các biến đó.
Martin Smith
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.