Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: скопировать часть таблицы  [new]
начинучка
Guest
Решил не создавать новой темы, а спросить в этой....

Задача - примерно аналогичная авторской.
Есть относительно большая таблица (порядка пары-тройки сотен миллионов записей), но актуальных данных в ней - всего пара миллионов. Собственно, задача - очистить таблицу от ненужных данных. Если делать удаления трех сотен миллионов - будет небыстро и накладно для сервера.
Родилась мысль - создать точную (по структуре) пустую копию таблицы . Сделать SWITCH старой и новой таблиц. Подкинуть только
нужные записи. Новую (бывшую старую) таблицу удалить.

В связи с чем возникло пара вопросов:
1) Взлетит ли на MS SQL 2012 SE ?
2) Как быть с IDENTITY-полем при вставке данных, чтобы вставились строки в том виде, как есть, без повторной генерации значений IDENTITY для них?
3) Как "перемотать" значения IDENTITY в новой таблице до нужного значения?
27 сен 17, 09:04    [20825697]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
начинучка,

SET IDENTITY_INSERT ON/OFF
27 сен 17, 09:09    [20825705]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
SWITCH это не "подкинуть только нужные записи".
Это переключить всю таблицу, какая она есть, в новую.
Смысл в этом какой?
27 сен 17, 09:11    [20825709]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
TaPaK,

это для отключения генерации идентитаев на момент вставки, правильно?
если в это время другие пользователи будут вставлять данные в таблицу - для них оно тоже окажется отключенным?

А как промотать немного вперед? К примеру с запасом на три-четыре миллиона?
27 сен 17, 09:13    [20825713]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
o-o,

такой, чтобы после замены таблиц местами вставить в пустую таблицу нужные три миллиона данных. вместо удаления 300 миллионов из старой. Я думаю - вставка трех миллионов отработает быстрее и менее накладно, чем удаление в сто раз большего числа данных. или я не прав?
27 сен 17, 09:15    [20825716]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Начинучка,

DBCC CHECKIDENT
27 сен 17, 09:19    [20825728]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Начинучка,

но я бы наверное из-за лени, добавил бы поле, повеси на него индекс, пометил им что удалять, и пачками удалял бы
27 сен 17, 09:20    [20825732]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
aleks222
Guest
TaPaK
Начинучка,

но я бы наверное из-за лени, добавил бы поле, повеси на него индекс, пометил им что удалять, и пачками удалял бы


Это не лень - это здравый смысл.

Покеда начинучка тут спрашивает и тренируется таблицы подменять - уже все бы удалилось...
27 сен 17, 09:59    [20825818]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
Начинучка
o-o,

такой, чтобы после замены таблиц местами вставить в пустую таблицу нужные три миллиона данных. вместо удаления 300 миллионов из старой. Я думаю - вставка трех миллионов отработает быстрее и менее накладно, чем удаление в сто раз большего числа данных. или я не прав?

еще раз, при чем тут SWITCH?
SWITCH будет менять местами полную с пустой, и только.
ничего никуда копировать он не будет.
так в чем же тайный смысл его применения?
почему просто не создать идентичную таблицу и туда не перелить нужное?
27 сен 17, 10:13    [20825866]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
o-o,

читай внимательнее мои посты. вроде же везде русским по белому написано - перекинуть таблицы, вставить 3 млн. данных. Никто не говорит, что это сделает switch. Это сделаю я, ручками. Основной посыл к вышеозвученным телодвижениям - максимально сократить время простоя, уменьшить количество DML-операций (3 млн INSERT-ов, вместо 300 млн DELETE-ов)
27 сен 17, 10:19    [20825890]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Начинучка,

автор
уменьшить количество DML-операций (3 млн INSERT-ов, вместо 300 млн DELETE-ов)

они у вас платные?
27 сен 17, 10:23    [20825910]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
TaPaK,

в процессе выполнения DELETE-ов разве таблица не будет лочиться? С ней, кроме меня, в это время будут работать другие пользователи.
Модель восстановления у базы - FULL. Лог файл не сильно распухнет при таком количестве удалений?
27 сен 17, 10:26    [20825932]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Начинучка
TaPaK,

в процессе выполнения DELETE-ов разве таблица не будет лочиться? С ней, кроме меня, в это время будут работать другие пользователи.
Модель восстановления у базы - FULL. Лог файл не сильно распухнет при таком количестве удалений?

я описал как сденлать чтобы не блокировалась вся таблица
27 сен 17, 10:31    [20825950]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
TaPaK,

я правильно понимаю, предлагается выполнить следующее:
1) добавить поле в таблицу,
2) проапдейтить это поле для строк, что подлежат удалению (это порядка 99% данных, в таблице из 300 млн. строк),
3) навесить на это поле индекс
4) пачками по х.з. сколько записей удалять данные из таблицы
5) удалить ранее созданное поле-индекс.

это точно по нагрузке будет серверу проще, чем:
1) создать аналогичную по структуре таблицу
2) сделать ей switch с исходной
3) вставить 3 млн. нужных записей в пустую таблицу
4) удалить старую таблицу...
27 сен 17, 10:42    [20825998]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
Начинучка
o-o,

читай внимательнее мои посты. вроде же везде русским по белому написано - перекинуть таблицы, вставить 3 млн. данных. Никто не говорит, что это сделает switch. Это сделаю я, ручками. Основной посыл к вышеозвученным телодвижениям - максимально сократить время простоя, уменьшить количество DML-операций (3 млн INSERT-ов, вместо 300 млн DELETE-ов)


сам читай внимательно,
или пиши внимательно, чего тебе надо.
автор
Есть относительно большая таблица (порядка пары-тройки сотен миллионов записей), но актуальных данных в ней - всего пара миллионов. Собственно, задача - очистить таблицу от ненужных данных.

содзал идентичную таблицу, в нее перелил нужное, старую дропнул, новую переименовал в старую.
зачем тут SWITCH?
27 сен 17, 10:42    [20826000]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Начинучка
Guest
o-o,

затем, что в таблицу постоянно идет запись. SWITCH (в моем понимании) делает относительно непродолжительный лок обоих таблиц, обменивает таблицы местами на уровне метаданных и снимает локи.
Если я буду делать INSERT нужных данных, то пока он пройдет (3 млн - немного, но мгновенно не вставятся), в исходную таблицу нальется ещё какое-то количество новых данных. Если я на время вставки сделаю лок на исходную таблицу, то это время будет несопоставимо с временем лока при свитче. Остальные пользователи в это время будут курить бамбук. А они должны работать.
Кроме того, в варианте с ручным переименованием и подмениваем таблиц неясен момент с переназначением прав доступа к новой таблице и с раскомпиляцией T-SQL кода, зависящего от старой таблицы.

Если я где-то неверно мыслю - исправляйте, буду рад восполнить пробел в знаниях.
27 сен 17, 10:58    [20826087]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить