powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация удаления строк
13 сообщений из 13, страница 1 из 1
Оптимизация удаления строк
    #38724243
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть вот такой запрос.

while @rownum <= 10000
begin

delete from #а where #а.rownumber = @rownum and #а.STATUS = @status

select @status = #а.STATUS from #d where #а.rownumber = @rownum;

set @rownum = @rownum + 1;

end;


Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки. Если же строка не удаляется, то я присваиваю переменной @status значения поля STATUS этой строки, чтобы уже это значение сравнивать с последующей строкой. В общем, ничего сложного, очень простой алгоритм. Только вот я столкнулся с тем, что это долго - обработка десяти тысяч строк занимает пару минут. Думаю, дело в том, что при каждом проходе цикла я и при удалении строки, и при присвоении переменной нового значения пролистываю все эти 10.000 строк в поисках нужной. Можно ли как-то оптимизировать всю эту бодягу? Поставить какие-то дополнительные условия, например, чтобы уже не лезть в отсмотренные строки таблицы, которые располагаются "выше" нужной?
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724317
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grum001Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки.Поскольку нет ORDER BY - не существует и понятия "следующей строки".
Посему всё описанное лишено смысла.

PS. Это вообще где происходит?
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724330
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, упорядочивание и нумерация строк были перед этим. Теперь у каждой строки есть номер в поле #а.rownumber, по которому и происходит просмотр таблицы. Предыдущая строка - та, где поле #а.rownumber меньше на единицу переменной @rownum, текущая - где #а.rownumber = @rownum, следующая - где #а.rownumber больше на единицу @rownum.
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724355
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grum001Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки. Если же строка не удаляется, то я присваиваю переменной @status значения поля STATUS этой строки, чтобы уже это значение сравнивать с последующей строкой.Я попробую описать вашу задачу, а не попытку её решения: для каждого статуса надо оставить только одну строку - с минимальным роунум. Так?
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724368
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grum001Добрый день. Есть вот такой запрос.

while @rownum <= 10000
begin

delete from #а where #а.rownumber = @rownum and #а.STATUS = @status

select @status = #а.STATUS from #d where #а.rownumber = @rownum;

set @rownum = @rownum + 1;

end;


Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки. Если же строка не удаляется, то я присваиваю переменной @status значения поля STATUS этой строки, чтобы уже это значение сравнивать с последующей строкой. В общем, ничего сложного, очень простой алгоритм. Только вот я столкнулся с тем, что это долго - обработка десяти тысяч строк занимает пару минут. Думаю, дело в том, что при каждом проходе цикла я и при удалении строки, и при присвоении переменной нового значения пролистываю все эти 10.000 строк в поисках нужной. Можно ли как-то оптимизировать всю эту бодягу? Поставить какие-то дополнительные условия, например, чтобы уже не лезть в отсмотренные строки таблицы, которые располагаются "выше" нужной?

что за бред....

200 статус 11 - переменая Статус = 11, РоуНамбер = 200+1
201 статус 11 ,== переменной Статус и номер строки подходящий,надо удалить, удаляем, не получилось....

=Если же строка не удаляется, то я присваиваю переменной @status значения поля STATUS этой строки

И??? что куда присваиваеться? если везде 11.


repeat

delete d
from table d join table dd on (d.number = dd.number + 1)
where d.status = dd.status
limit 100;

until row_count() = 0;
end repeat;
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724369
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, не совсем. Единственное условие - чтобы две строки с одинаковым полем #а.STATUS не шли друг за другом (очередность определяется по полю #а.rownumber). В поле #а.STATUS, к слову, всего четыре разных значения на все десять тысяч строк. Разумеется, строки с одинаковым полем #а.STATUS будут попадаться в таблице очень часто, лишь бы не подряд.
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724378
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453, во-первых, я не понял, с чего вы решили, что поле STATUS везде 11. Во-вторых, в вашем примере строка "201 статус 11" будет удалена.

авторdelete from #а where #а.rownumber = @rownum and #а.STATUS = @status

Поле #а.STATUS этой строки равно значению переменной @status, которая хранит поле #а.STATUS предыдущей. Условие на удаление выполнено. Уверяю, этот алгоритм работает прекрасно.
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724381
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
delete from table
where rownumber in
( select t1.rownumber
  from table t1, table t2
  where t1.rownumber = t2.rownumber+1
  and t1.status = t2.status
)
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724388
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

мдя..ошибочка вышла... дублей может быть больше чем 2.

а
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724391
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grum001tanglir, не совсем. Единственное условие - чтобы две строки с одинаковым полем #а.STATUS не шли друг за другом (очередность определяется по полю #а.rownumber). В поле #а.STATUS, к слову, всего четыре разных значения на все десять тысяч строк. Разумеется, строки с одинаковым полем #а.STATUS будут попадаться в таблице очень часто, лишь бы не подряд.

тогда покатит

repeat

delete d
from table d join table dd on (d.number = dd.number + 1)
where d.status = dd.status
limit 100;

until row_count() = 0;
end repeat;

я думал ваще дубли все удалить.
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724394
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grum001alex564657498765453, во-первых, я не понял, с чего вы решили, что поле STATUS везде 11. Во-вторых, в вашем примере строка "201 статус 11" будет удалена.

авторdelete from #а where #а.rownumber = @rownum and #а.STATUS = @status

Поле #а.STATUS этой строки равно значению переменной @status, которая хранит поле #а.STATUS предыдущей. Условие на удаление выполнено. Уверяю, этот алгоритм работает прекрасно.

ты не понял моего поста

опиши три итерации цикла по своему алгоритму(можешь для себя на листике)
где
200 строка статут 10
201 строка статус 11
202 строка статус 11 , НО УДАЛИТЬ НЕ ПОЛУЧИЛОСЬ. ...вот тут , какой статус ты куда собираешься присваивать, а главное зачем - если все статусы на этом шаге будут равны 11
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724396
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, спасибо, попробую так.
...
Рейтинг: 0 / 0
Оптимизация удаления строк
    #38724415
Grum001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453тогда покатит

repeat

delete d
from table d join table dd on (d.number = dd.number + 1)
where d.status = dd.status
limit 100;

until row_count() = 0;
end repeat;


Гм. Может хорошо сработать, про такую обработку я не подумал.

alex564657498765453ты не понял моего поста

опиши три итерации цикла по своему алгоритму(можешь для себя на листике)
где
200 строка статут 10
201 строка статус 11
202 строка статус 11 , НО УДАЛИТЬ НЕ ПОЛУЧИЛОСЬ. ...вот тут , какой статус ты куда собираешься присваивать, а главное зачем - если все статусы на этом шаге будут равны 11


"200 строка статут 10"
На входе @rownum = 200, @status хранит значение предыдущей строки с номером 199, положим, он был 9. Тогда первая строка не удалится. Так как она не удалится, то пройдет операция присвоения переменной @status нового значения, по статусу текущей строки, т.е. @status = 10. @rownum = @rownum + 1 = 200 +1 = 201. Итерация окончена, идем на новый круг.

"201 строка статус 11"
Условие на удаление #а.STATUS = @status превращается в 11 = 10. Условие не выполняется, значит, строка не будет удалена. Так как она не удалится, то пройдет операция присвоения переменной @status нового значения, по статусу текущей строки, т.е. @status = 11. @rownum = @rownum + 1 = 201 +1 = 202. Итерация окончена, идем на новый круг.

"202 строка статус 11"
Условие на удаление #а.STATUS = @status превращается в 11 = 11. Условие выполняется, значит, строка будет удалена. Так как она удалена, присвоения переменной @status нового значения не будет, так как там стоит условие "where #а.rownumber = @rownum", а строка с таким #а.rownumber только что была удалена. Таким образом, @status = 11, @rownum = @rownum + 1 = 202 +1 = 203. Итерация окончена, идем на новый круг.

Я так и не понял, что значит "НО УДАЛИТЬ НЕ ПОЛУЧИЛОСЬ". Почему может не получиться-то?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация удаления строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]