У меня есть таблица с ~ 17 миллионами строк в ней. Мне нужно удалить дубликаты строк в таблице. В обычных условиях это не будет проблемой, однако это не нормальное обстоятельство. Обычно «повторяющиеся строки» определяются как две или более строк, содержащих одинаковые значения для всех столбцов. В этом случае «повторяющиеся строки» определяются как две или более строк, которые имеют одинаковые значения, но также находятся в пределах 20 секунд друг от друга. Я написал скрипт, который все еще работает через 19.5 часов, это неприемлемо, но я не уверен, как это сделать. Вот сценарий:удаление дубликатов строк в таблице sql server 2005
begin
create table ##dupes (ID int)
declare curOriginals cursor for
select ID, AssociatedEntityID, AssociatedEntityType, [Timestamp] from tblTable
declare @ID int
declare @AssocEntity int
declare @AssocType int
declare @Timestamp datetime
declare @Count int
open curOriginals
fetch next from curOriginals into @ID, @AssocEntity, @AssocType, @Timestamp
while @@FETCH_STATUS = 0
begin
select @Count = COUNT(*) from tblTable where AssociatedEntityID = @AssocEntity and AssociatedEntityType = @AssocType
and [Timestamp] >= DATEADD(ss, -20, @Timestamp)
and [Timestamp] <= DATEADD(ss, 20, @Timestamp)
and ID <> @ID
if (@Count > 0)
begin
insert into ##dupes (ID)
(select ID from tblHBMLog where AssociatedEntityID = @AssocEntity and AssociatedEntityType = @AssocType
and [Timestamp] >= DATEADD(ss, -20, @Timestamp)
and [Timestamp] <= DATEADD(ss, 20, @Timestamp)
and ID <> @ID)
print @ID
end
delete from tblHBMLog where ID = @ID or ID in (select ID from ##dupes)
fetch next from curOriginals into @ID, @AssocEntity, @AssocType, @Timestamp
end
close curOriginals
deallocate curOriginals
select * from ##dupes
drop table ##dupes
end
Любая помощь была бы принята с благодарностью.
Не хотите ли вы определить, что означает «de-duplicate»? –
Что происходит, когда у вас есть три записи, a, b, c. a = 00 secs b = 19 secs c = 39 secs Все ли они считаются одними и теми же? (a находится в пределах 20 секунд от b, b находится в пределах 20 секунд от c) –
Курсор против 19,5 миллионов строк - ouch – MartW