Sau khi tìm kiếm stackoverflow.com Tôi đã tìm thấy một số câu hỏi yêu cầu cách xóa các bản sao, nhưng không ai trong số chúng giải quyết được tốc độ.Kỹ thuật nhanh nhất để xóa dữ liệu trùng lặp
Trong trường hợp của tôi, tôi có một bảng có 10 cột chứa 5 triệu bản sao hàng chính xác. Ngoài ra, tôi có ít nhất một triệu hàng khác với các bản sao trong 9 trong số 10 cột. Kỹ thuật hiện tại của tôi đang thực hiện (cho đến nay) 3 giờ để xóa 5 triệu hàng này. Đây là quá trình của tôi:
-- Step 1: **This step took 13 minutes.** Insert only one of the n duplicate rows into a temp table
select
MAX(prikey) as MaxPriKey, -- identity(1, 1)
a,
b,
c,
d,
e,
f,
g,
h,
i
into #dupTemp
FROM sourceTable
group by
a,
b,
c,
d,
e,
f,
g,
h,
i
having COUNT(*) > 1
Tiếp theo,
-- Step 2: **This step is taking the 3+ hours**
-- delete the row when all the non-unique columns are the same (duplicates) and
-- have a smaller prikey not equal to the max prikey
delete
from sourceTable
from sourceTable
inner join #dupTemp on
sourceTable.a = #dupTemp.a and
sourceTable.b = #dupTemp.b and
sourceTable.c = #dupTemp.c and
sourceTable.d = #dupTemp.d and
sourceTable.e = #dupTemp.e and
sourceTable.f = #dupTemp.f and
sourceTable.g = #dupTemp.g and
sourceTable.h = #dupTemp.h and
sourceTable.i = #dupTemp.i and
sourceTable.PriKey != #dupTemp.MaxPriKey
Bất cứ lời khuyên về cách để tăng tốc độ này lên, hoặc một cách nhanh hơn? Hãy nhớ rằng tôi sẽ phải chạy lại cho các hàng không trùng lặp chính xác.
Cảm ơn rất nhiều.
CẬP NHẬT:
Tôi phải dừng bước 2 khi chạy ở mốc 9 giờ. Tôi đã thử phương pháp OMG Ponies và kết thúc chỉ sau 40 phút. Tôi đã thử bước 2 của mình với xóa hàng loạt của Andomar, nó chạy 9 giờ trước khi tôi dừng nó lại. CẬP NHẬT: Chạy một truy vấn tương tự với một trường ít hơn để loại bỏ một tập bản sao khác và truy vấn chỉ chạy trong 4 phút (8000 hàng) bằng phương pháp OMG Ponies.
Tôi sẽ thử kỹ thuật cte cơ hội tiếp theo tôi nhận được, tuy nhiên, tôi nghi ngờ phương pháp OMG Ponies 'sẽ khó đánh bại.
Một vài cách tối ưu hóa dễ dàng các truy vấn của bạn ở trên - bạn không cần phải có, b, c vv trong 'SELECT' của truy vấn hàng đầu - bạn chỉ cần PriKey và thả HAVING - rồi , trong truy vấn thứ hai chỉ 'DELETE FROM sourceTable WHERE PriKey NOT IN (CHỌN DT.MaxPriKey FROM #dupTemp DT)' –
Cảm ơn bạn đã có mẹo. –