วิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดผลลัพธ์ขนาดใหญ่สองชุดใน SQL Server 2012


9

คำแนะนำในปัจจุบันสำหรับวิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดผลลัพธ์ / แถวขนาดใหญ่สองชุดดูเหมือนว่าจะใช้ตัวEXCEPTดำเนินการ สคริปต์ SQL ที่มีอยู่ในตัวเองด้านล่างนี้ไม่มีประสิทธิภาพมากเมื่อขนาดของแถวเพิ่มขึ้น (เปลี่ยนค่า @last) ฉันพยายามค้นหารายการที่ไม่ซ้ำในตารางรวม แต่ไม่มีการปรับปรุง

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

คำตอบ:


8

EXCEPTแสดงถึงการDISTINCTดำเนินการ

ฉันจะใช้NOT EXISTSถ้าไม่จำเป็นจริงๆ

อย่างไรก็ตามปัญหาที่คุณมีอยู่มีแนวโน้มว่าคุณจะได้รับลูปซ้อนกันบนตารางที่ไม่ได้จัดทำดัชนีเนื่องจากการประเมิน cardinality ต่ำที่เกี่ยวข้องกับตัวแปรตาราง

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

จะสามารถพิจารณาได้ว่าตารางแต่ละแถวมี 100K และให้แผนที่แตกต่างกัน

ใน SQL Server 2012 คุณสามารถเพิ่มดัชนีให้กับตัวแปรตารางผ่านข้อ จำกัด เท่านั้น หากค่าไม่ซ้ำกันคุณสามารถใช้

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

เพื่อเพิ่มดัชนี หากทำทั้งสองตารางแผน (หลังจากเพิ่มคำแนะนำการคอมไพล์ซ้ำ) น่าจะใช้การรวมการเข้าร่วมแทน หากไม่มีดัชนีใด ๆ ฉันก็คาดหวังว่าจะมีแฮชเข้าร่วม


ขอบคุณมาร์ติน นี่คือคำตอบ OPTION (RECOMPILE) ช่วย (100,000 ใน 5 นาที) แต่ UNIQUE CLUSTERED บนโต๊ะทั้งสองทำให้การปรับปรุงครั้งใหญ่ (100,000 ใน 7 วินาที !!!) ฉันสร้างตารางเหล่านี้เพื่อแสดงให้เห็นถึงปัญหาชีวิตจริงที่ฉันไม่สามารถควบคุมการจัดทำดัชนีตารางบนเซิร์ฟเวอร์ SQL สองตัวที่แตกต่างกัน แต่ฉันจะจัดการผ่านตัวแปรตารางดังกล่าว
Will Healey

4
@WillHealey #tempตารางมีข้อได้เปรียบเหนือตัวแปรตารางมากมาย (สถิติ, ความเท่าเทียม, การจัดทำดัชนีที่ยืดหยุ่นมากขึ้น) ดังนั้นหากคุณไม่ได้ใช้สิ่งนี้ในบริบทที่คุณถูก จำกัด ไว้ที่ตัวแปร Table คุณสามารถลองใช้ตัวแปรเหล่านั้นได้เช่นกัน
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.