Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скрипт для тестового задания, прокомментируете решение.  [new]
teCa
Member

Откуда: Москва
Сообщений: 961
Добрый день! Задача звучит так:

автор
Задача 2
Предположим , что в таблице UDFs 3 млрд записей.
Требуется написать скрипт, чтобы перенести их из базы данных А в базу данных В порциями по 100 000 записей, не привязываясь к дате и не используя джойны.


На примере своих данных накидал вот такой скрипт, который вы принципе справляется с задачей, но у меня есть к нему пару вопросов.

declare @maxid as int, @minid as int, @countA as int, @countB as int
set @countB = 0
select @countA = COUNT(*) from test.dbo.testA -- Получаем общее число строк для определения границ цикла
while (@countA <> @countB)
begin
select top 100 * into ##temp10 from test.dbo.testA order by char_id
select @minid=min(char_id),@maxid = Max(CHAR_id) from ##temp10
insert into test.dbo.testB (char_name)
select char_name from ##temp10
delete test.dbo.testA where char_id between @minid and @maxid 
drop table ##temp10
select @countB = COUNT(*) from test.dbo.testB
end


1. Скрипт требует наличи в таблице уникального, возрастающего числового поля, по которому я сначала сортирую весь результат и могу произвести удаление после вставки. Те, если бы таблица не содержала такого поля, то мой пример уже бы не сработал.

2. Интересно, как будет отрабатывать delete с условием на 3 млрд записей. Нет опыта работы с таким объёмом.

3. Ну и хочется знать, исходя из условий, как поступили бы вы?
5 май 16, 15:21    [19138797]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
Glory
Member

Откуда:
Сообщений: 104751
delete top 100 000 from tab1
output tab2
В цикле с проверкой @@rowcount
5 май 16, 15:24    [19138814]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
delete top 100 000 from tab1
output tab2
В цикле с проверкой @@rowcount
Из задания непонятно, надо ли удалять первичные записи.
"Перенести" - понятие растяжимое.
5 май 16, 15:28    [19138828]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
teCa
Member

Откуда: Москва
Сообщений: 961
iap,
Нужно
5 май 16, 15:29    [19138831]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap,

ну в скрипте ТС их удаляет, да и про удаление спрашивает, так что наверное надо.
5 май 16, 15:29    [19138833]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
iap,

ну в скрипте ТС их удаляет, да и про удаление спрашивает, так что наверное надо.
Он ответил, что нужно.
А так - ведь он написал скрипт так, как понял задание.
Могут ведь придраться: разве было сказано удалять?! Садитесь, два!
5 май 16, 15:31    [19138846]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
teCa
Ну и хочется знать, исходя из условий, как поступили бы вы?


1)
ALTER TABLE A ADD RV ROWVERSION NOT NULL 

SELECT TOP 100000 *
FROM A
WHERE RV > загруженная на другой сервер AND RV < MIN_ACTIVE_ROWVRSION() 
ORDER BY RV ASC 

2) Change Data Tracking
5 май 16, 15:32    [19138850]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
А так - ведь он написал скрипт так, как понял задание.
Могут ведь придраться: разве было сказано удалять?! Садитесь, два!

А еще возможно это вольный переврд с английского
В котором, например, и move и copy можно на русский перевести как перенести.
5 май 16, 15:38    [19138879]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
iap
А так - ведь он написал скрипт так, как понял задание.
Могут ведь придраться: разве было сказано удалять?! Садитесь, два!

А еще возможно это вольный переврд с английского
В котором, например, и move и copy можно на русский перевести как перенести.
Да.
Есть ещё интересное слово remove, которое хочется перевести как "передвинуть", а на самом деле означает "удалить".
5 май 16, 15:43    [19138906]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Glory
delete top 100 000 from tab1
output tab2
В цикле с проверкой @@rowcount

Поддерживаю данный вариант. teCa, единственное, чем его можно дополнить - это делать периодический бекап лога или чекпоинт (в зависимости от модели восстановления), чтобы не вызывать рост лога.

DECLARE @t1 TABLE (val INT)
INSERT INTO @t1
SELECT number
FROM [master].dbo.spt_values

DECLARE @t2 TABLE (val INT)

DECLARE @rows INT = -1

WHILE @rows != 0 BEGIN

    DELETE TOP(100000)
    FROM @t1
    OUTPUT DELETED.val INTO @t2

    SET @rows = @@rowcount
    IF @rows > 0
        CHECKPOINT -- BACKUP LOG

END
5 май 16, 16:19    [19139080]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlanDenton,

а зачем CHECKPOINT?
Если произойдёт ошибка на каком-то шаге, то надо будет просто запустить скрипт ещё раз.
Del:
DELETE TOP(100000) @t1 OUTPUT deleted.val INTO @t2;
IF @@ROWCOUNT>0 GOTO Del;
5 май 16, 16:29    [19139148]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
iap
а зачем CHECKPOINT?

http://sqlperformance.com/2013/03/io-subsystem/chunk-deletes
Тут все хорошо расписано.

Относительно использования GOTO мне кажется это сомнительная штука в данном примере. Возможно не прав.
5 май 16, 16:39    [19139216]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlanDenton
Относительно использования GOTO мне кажется это сомнительная штука в данном примере. Возможно не прав.
А зачем пляски с бубнами?
Мы разве виноваты, что Microsoft не удосужился сделать цикл наподобие do while или repeat until (как в Pascalе)?
5 май 16, 16:52    [19139304]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для тестового задания, прокомментируете решение.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
iap
А зачем пляски с бубнами?

Пожалуй соглашусь с Вами.
5 май 16, 16:58    [19139337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить