|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
kostik88Mikle83, на счет удаления данных, я же беру некоторое количество записей, копирую их в хистори таблицу, и тут же по этому же диапазону произвожу удаление данных. Далее, изменение структуры таблицы увы не допустимо. Это на счет флага для скопированных записей. так менять структуру основной таблицы не надо. Флаг добавляется в архивную таблицу. Алгоритм: 1. копируем данные из основной в архивную (флаг HasDeleted = 0 ) 2. удаляем записи из основной, которые есть в архивной с флагом HasDeleted = 0 3. обновляем записи в архивной: если HasDeleted = 0 и запись отсутствует в основной - ставим флагу значение 1. Основная мысль - развести потоки копирования и удаления по разным процессам. В вашем случае вполне вероятно это не потребуется. kostik88На счет отключения репликации, а это процедура sp_setrepproc разве не сделает то же самое? То есть я оберну выполнение своей процедуры через эту функцию, и отдельно запущу на издателе и подписчике. Как вариант, можно через нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 12:27 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
Mikle83, Спасибо за консультации! Вот еще бы динамически вычислять max(id) для конца периода, а то руками в несколько приемов приходится делать :). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 12:43 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Деление на 10 делается для получения 1? ну то есть при @BatchSize = 100 ? Шаг единиуа. Правильно я понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 13:50 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
kostik88Деление на 10 делается для получения 1? ну то есть при @BatchSize = 100 ? Шаг единиуа. Правильно я понял ? Шаг 10 при BacthSize = 100. Принцип - да, правильно. Дабы не взять сразу 2 или 3 "разовых" объема записей - увеличиваем диапазон по не много, пока не наберем +/- нужное количество записей. Т.е. по факту у вас может быть количество записей от 100% до 110% от BatchSize. Если критичен такой объем и надо более точно "отмерять" = можно сделать "шаг" по 1%, по 0.5%. 10% для меня было оптимальным соотношением между "стабильностью" количества данных в каждом батче и количеством иттераций на поиск диапазона. P.S.: кстати, в итоге делал более продвинутый (но и более сложный) вариант этого механизма: если диапазон MinId MaxId не содержал нужного количества записей, то инкремент делался не последовательно а через алгоритм а) найти минимальный ID, который больше MaxId б) установить MaxId = найденный ID в пункте а) + (BatchSize - count_в_текущем_диапазоне). Еще меньше иттераций на поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 14:01 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
Вообщем, вот такой зверек получился :) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
Так теперь же нужно его поводок сделать, то есть, как то ограничение сделать, что бы можно было в любое время после запуска, остановить. а как ? не лепить же цикл сверху существующего цикла ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 15:51 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
kostik88, оч просто перед циклом объявляете переменную, даже две Код: sql 1. 2.
Ну и в условие while- цикла добавляете что-то типа: Код: sql 1.
с точностью до синтаксиса ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 16:14 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
Код: sql 1.
а это с какой целью добавлено? про остановить в любое (вообще любое) время - можно делать "остановку" через служебную таблицу, типа Код: sql 1.
так же в цикл while добивается условие Код: sql 1.
Т.е. как только в таблице появится запись для вашего процесса со статусом = 1 - выполнение процедуры прервется на ближайшем шаге цикла. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 16:57 |
|
Удаление из большой таблицы. Как?
|
|||
---|---|---|---|
#18+
Mikle83, Вариант супер, спасибо в очередной раз, и еще уточнить хотел, у меня инсерт и делит обернуты в транзакцию, в теории это должно помочь в ситуации когда мне может потребоваться остановить процесс, кильнуть процесс. В таком случае транзакция если была в процесс откатится ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2015, 17:06 |
|
|
start [/forum/topic.php?fid=55&msg=38861724&tid=2009784]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
170ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 283ms |
0 / 0 |