powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Удаление из большой таблицы. Как?
8 сообщений из 33, страница 2 из 2
Удаление из большой таблицы. Как?
    #38861589
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kostik88Mikle83,
на счет удаления данных, я же беру некоторое количество записей, копирую их в хистори таблицу, и тут же по этому же диапазону произвожу удаление данных.
Далее, изменение структуры таблицы увы не допустимо. Это на счет флага для скопированных записей.

так менять структуру основной таблицы не надо. Флаг добавляется в архивную таблицу.
Алгоритм:
1. копируем данные из основной в архивную (флаг HasDeleted = 0 )
2. удаляем записи из основной, которые есть в архивной с флагом HasDeleted = 0
3. обновляем записи в архивной: если HasDeleted = 0 и запись отсутствует в основной - ставим флагу значение 1.

Основная мысль - развести потоки копирования и удаления по разным процессам.
В вашем случае вполне вероятно это не потребуется.


kostik88На счет отключения репликации, а это процедура sp_setrepproc разве не сделает то же самое? То есть я оберну выполнение своей процедуры через эту функцию, и отдельно запущу на издателе и подписчике.
Как вариант, можно через нее.
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861604
kostik88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mikle83,
Спасибо за консультации!
Вот еще бы динамически вычислять max(id) для конца периода, а то руками в несколько приемов приходится делать :).
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861724
kostik88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select @Min = MinValue from the Table_WhichStore_ResultsOfExecution
Set @Max = @Min + @BatchSize
Set @RC = 0
while (@RC < @BatchSize) and (@Max < [@Max_ID]) --where @Max_ID - maximum value of the identifier at the table
begin
  Set @Max = @Max + @BatchSize/10
  select @RC = count(*) from SourceTable where ID between @Min and @Max
end




Деление на 10 делается для получения 1? ну то есть при @BatchSize = 100 ?
Шаг единиуа. Правильно я понял ?
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861743
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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_в_текущем_диапазоне).

Еще меньше иттераций на поиск.
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861870
kostik88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем, вот такой зверек получился :)

Код: 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.
go
Create proc dbo.usp_cut_member_npb_date @Max_ID int, @BatchSize int
As 
DECLARE @Min int
DECLARE @Max int
DECLARE @RC int

Select @Min = min(id) from member_npb

Set @Max = @Min + @BatchSize
Set @RC = 0
while 
	(@RC < @BatchSize) and (@Max < @Max_ID) --where @Max_ID - maximum value of the identifier at the table
begin
	BEGIN TRAN 
		Set @Max = @Max + @BatchSize/10

		INSERT M..a_member_npb 
		(id,year_,qq_,member_id,complect_code,chances,state,num,shop_del)

		SELECT * 
		from member_npb 
		where id between @Min and @Max

		IF @@error <>0 goto  lab1                                
			DELETE 
			from member_npb 
			where id between @Min and @Max
                IF @@error <>0 goto lab1  
        COMMIT TRAN 

	select @RC = count(*) from member_npb where id between @Min and @Max
--print '%1! - %2!.',@Min,@Max
END  
    waitfor delay "00:00:03"                        

RETURN 0 
lab1:                         
ROLLBACK TRAN 
RETURN -1 
go




Так теперь же нужно его поводок сделать, то есть, как то ограничение сделать, что бы можно было в любое время после запуска, остановить.
а как ?
не лепить же цикл сверху существующего цикла ?
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861893
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kostik88,

оч просто
перед циклом объявляете переменную, даже две
Код: sql
1.
2.
Declare @CurDT DateTime set @CurDT = getdate()
Declare @Work_Time int Set @Work_Time= 30 -- this could be declared as a input parameter




Ну и в условие while- цикла добавляете что-то типа:

Код: sql
1.
and (DateDiff(minute, getdate(), @CurDT) < @WorkTime)


с точностью до синтаксиса
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861956
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
waitfor delay "00:00:03"    


а это с какой целью добавлено?

про остановить в любое (вообще любое) время - можно делать "остановку" через служебную таблицу, типа
Код: sql
1.
DBProcess(Id_Proc, Status)



так же в цикл while добивается условие

Код: sql
1.
and (not exists (select 1 from DBProcess where Id_Proc = 1 and Status = 1))



Т.е. как только в таблице появится запись для вашего процесса со статусом = 1 - выполнение процедуры прервется на ближайшем шаге цикла.
...
Рейтинг: 0 / 0
Удаление из большой таблицы. Как?
    #38861968
kostik88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mikle83,

Вариант супер, спасибо в очередной раз, и еще уточнить хотел, у меня инсерт и делит обернуты в транзакцию, в теории это должно помочь в ситуации когда мне может потребоваться остановить процесс, кильнуть процесс. В таком случае транзакция если была в процесс откатится ?
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Удаление из большой таблицы. Как?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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