Я собираюсь поговорить об интересной теме в мире SQL. Если вы воспользуетесь этой темой в Google, вы найдете несколько способов удаления повторяющихся данных из таблицы. Я не собираюсь писать что-то очень новое, но да, я буду говорить о проблеме производительности, удаляя дублирующиеся данные, используя традиционный подход.
Удаление дублирующихся строк из SQL 2000: - Я создал таблицу DuplicateData и вставил несколько дублирующихся строк на основе EmpId.
Создать таблицу DuplicateData (EmpId int, Имя varchar (100)) -> Создание таблицы
insert into DuplicateData values(4,'Akshay')
insert into DuplicateData values(4,'Akshay')
insert into DuplicateData values(5,'ankit')
insert into DuplicateData values(3,'Vikas')
insert into DuplicateData values(3,'Vikas')
insert into DuplicateData values(3,'Vikas')
insert into DuplicateData values(3,'Vikas')
insert into DuplicateData values(2,'Raj')
insert into DuplicateData values(2,'Raj')
insert into DuplicateData values(1,'Neeraj')
insert into DuplicateData values(1,'Neeraj')
insert into DuplicateData values(1,'Neeraj')
Традиционный способ удаления дублирующихся строк из таблицы в SQL 2000: -Если мы запустим приведенный ниже пакет в анализаторе запросов, он удалит все дублирующиеся значения из таблицы DuplicateData. Этот запрос «ОК», если вы делаете это в тестовой среде или на фиктивных данных. Но если у вас есть миллионы записей или большие данные, этот запрос будет худшим с точки зрения производительности. Это может занять несколько часов или дней в зависимости от объема данных в предполагаемой таблице.
Причина: - Под запросом находится коррелированный подзапрос, который будет выполняться для каждого EmpId, присутствующего в таблице, и проверять, равно ли число для каждого EmpId> 1, а затем удалять каждую запись одну за другой. Это является причиной его низкой производительности.
set rowcount 1
delete from DuplicateData where (select count(EmpId) from DuplicateData a where a.EmpId=DuplicateData.EmpId)>1
while @@rowcount>0
delete from DuplicateData where (select count(EmpId) from DuplicateData a where a.EmpId=DuplicateData.EmpId)>1
set rowcount 0
Мы можем создать хранимую процедуру, чтобы преодолеть эту проблему производительности. Ниже приведен пример.
declare @tmp table(empid int,cnt int, rowid int identity)--> declare table variable
declare @maxcounter as integer--> Declaration of variables
declare @mincounter as integer
declare @rowcnt as integer
declare @empid as int-->End of Declaration
insert into @tmp(empid,cnt)-->Inserting duplicate empid along with no of duplicate entries
select empid,count(empid) from duplicatedata
group by empid having count(empid)>1
select @mincounter=min(rowid),@maxcounter=max(rowid) from @tmp -->assigning minimum and maximum rowid to variables.
while @mincounter <=@maxcounter
begin
select @rowcnt=cnt,@empid=empid from @tmp where rowid=@mincounter
set @rowcnt =@rowcnt-1
set rowcount @rowcnt
delete from duplicatedata where empid=@empid
set rowcount 0
set @mincounter=@mincounter +1
end
давайте разберемся с приведенным выше циклом while, у нас есть все повторяющиеся записи в таблице @tmp без повторяющихся записей. Теперь мы будем перебирать каждую запись, присутствующую в таблице @tmp, поэтому мы присвоили минимальный и максимальный rowid переменным (@maxcounter, @mincounter).
В теле цикла While мы присваиваем значения «no of duplicate records» переменной @rowcnt и empid переменной @ empid
В следующем операторе мы устанавливаем @ rowcnt = @ rowcnt-1, мы делаем это, потому что эта переменная не содержит повторяющихся записей для определенного empid, но мы хотим сохранить один empid из дублирующих.
в следующем утверждении мы устанавливаем количество строк на одно значение меньше, чем количество повторяющихся записей для этого конкретного empid.
Следующий оператор сбрасывает количество строк с 0, а последний оператор увеличивает значение @mincounter для получения следующей записи из таблицы @tmp.