|
|
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть вот такой запрос. 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 строк в поисках нужной. Можно ли как-то оптимизировать всю эту бодягу? Поставить какие-то дополнительные условия, например, чтобы уже не лезть в отсмотренные строки таблицы, которые располагаются "выше" нужной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:38:30 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Grum001Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки.Поскольку нет ORDER BY - не существует и понятия "следующей строки". Посему всё описанное лишено смысла. PS. Это вообще где происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:19:16 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Akina, упорядочивание и нумерация строк были перед этим. Теперь у каждой строки есть номер в поле #а.rownumber, по которому и происходит просмотр таблицы. Предыдущая строка - та, где поле #а.rownumber меньше на единицу переменной @rownum, текущая - где #а.rownumber = @rownum, следующая - где #а.rownumber больше на единицу @rownum. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:24:38 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Grum001Я пролистываю таблицу из десяти тысяч строк, удаляя те строки, в которых поле STATUS соответствует полю STATUS предыдущей строки. Если же строка не удаляется, то я присваиваю переменной @status значения поля STATUS этой строки, чтобы уже это значение сравнивать с последующей строкой.Я попробую описать вашу задачу, а не попытку её решения: для каждого статуса надо оставить только одну строку - с минимальным роунум. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:41:02 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:44:17 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
tanglir, не совсем. Единственное условие - чтобы две строки с одинаковым полем #а.STATUS не шли друг за другом (очередность определяется по полю #а.rownumber). В поле #а.STATUS, к слову, всего четыре разных значения на все десять тысяч строк. Разумеется, строки с одинаковым полем #а.STATUS будут попадаться в таблице очень часто, лишь бы не подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:44:46 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, во-первых, я не понял, с чего вы решили, что поле STATUS везде 11. Во-вторых, в вашем примере строка "201 статус 11" будет удалена. авторdelete from #а where #а.rownumber = @rownum and #а.STATUS = @status Поле #а.STATUS этой строки равно значению переменной @status, которая хранит поле #а.STATUS предыдущей. Условие на удаление выполнено. Уверяю, этот алгоритм работает прекрасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:48:13 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:48:27 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, мдя..ошибочка вышла... дублей может быть больше чем 2. а ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:52:45 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
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; я думал ваще дубли все удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:55:04 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Grum001alex564657498765453, во-первых, я не понял, с чего вы решили, что поле STATUS везде 11. Во-вторых, в вашем примере строка "201 статус 11" будет удалена. авторdelete from #а where #а.rownumber = @rownum and #а.STATUS = @status Поле #а.STATUS этой строки равно значению переменной @status, которая хранит поле #а.STATUS предыдущей. Условие на удаление выполнено. Уверяю, этот алгоритм работает прекрасно. ты не понял моего поста опиши три итерации цикла по своему алгоритму(можешь для себя на листике) где 200 строка статут 10 201 строка статус 11 202 строка статус 11 , НО УДАЛИТЬ НЕ ПОЛУЧИЛОСЬ. ...вот тут , какой статус ты куда собираешься присваивать, а главное зачем - если все статусы на этом шаге будут равны 11 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:56:39 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
Akina, спасибо, попробую так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:58:08 |
|
||
|
Оптимизация удаления строк
|
|||
|---|---|---|---|
|
#18+
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. Итерация окончена, идем на новый круг. Я так и не понял, что значит "НО УДАЛИТЬ НЕ ПОЛУЧИЛОСЬ". Почему может не получиться-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 13:05:47 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38724388&tid=1834337]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 332ms |

| 0 / 0 |
