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

Откуда:
Сообщений: 24
Привет.

Подскажите как можно скопировать часть таблицы в новую?


Думаю надо что-то типа такого:

а)наложить блокировку на таблицу, чтобы ее ни кто не мог изменить.
б) select * новая_таблица from таблица where условие
в) ALTER TABLE таблица TO таблица_старая
г) ALTER TABLE новая_таблица TO таблица
д) снятие блокировки




Подскажите как блокировку сделать и какую?
31 июл 17, 13:58    [20688005]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Куда скопировать? Зачем скопировать? Что за волшебные пункты "в" и "г" ?

Сообщение было отредактировано: 31 июл 17, 14:07
31 июл 17, 14:06    [20688057]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
а и д совершенно не очевидны.
31 июл 17, 14:10    [20688076]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич
Куда скопировать? Зачем скопировать? Что за волшебные пункты "в" и "г" ?


скопировать в ту же БД
31 июл 17, 14:23    [20688140]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
а и д совершенно не очевидны.


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
31 июл 17, 14:23    [20688143]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
Владислав Колосов
а и д совершенно не очевидны.


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?
31 июл 17, 14:28    [20688176]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
пропущено...


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
31 июл 17, 15:14    [20688546]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
правильный проходящий.
пропущено...
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
И почему вы решили, что вам обязательно нужна именно ручная блокировка/разблокировка? Вы их вообще видели? Чем не подошли транзакции и уровни их изоляции? Или вы про них не знаете? И потому считаете, что надо действовать как в старых настольных однопользовательских СУБД только руками, только все сами, явно и т.д.? Думаете, создатели серверов баз данных совершенно не в теме многопользовательского доступа к данным?
31 июл 17, 16:00    [20688788]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
ХД,

Вы не хотите, чтобы когда не происходило изменение?
Во время чтения страницы данных изменение не произойдёт. Т. е. запрос будет всегда читать корректные данные за исключением уровня изоляции UNCOMMITTED, если Вы его установите.
31 июл 17, 16:21    [20688900]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
Если вы не хотите, чтобы в таблицу что-то записывали - добавьте триггер, который будет выбрасывать исключение при обновлении или записи.
31 июл 17, 16:34    [20688958]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
пропущено...


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
И почему вы решили, что вам обязательно нужна именно ручная блокировка/разблокировка? Вы их вообще видели? Чем не подошли транзакции и уровни их изоляции? Или вы про них не знаете? И потому считаете, что надо действовать как в старых настольных однопользовательских СУБД только руками, только все сами, явно и т.д.? Думаете, создатели серверов баз данных совершенно не в теме многопользовательского доступа к данным?


А вы какой вариант предлагаете?
31 июл 17, 16:47    [20688991]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
Если вы не хотите, чтобы в таблицу что-то записывали - добавьте триггер, который будет выбрасывать исключение при обновлении или записи.


Хм... интересная мысль!
31 июл 17, 16:47    [20688995]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
ХД,

Вы не хотите, чтобы когда не происходило изменение?



чтобы пока копируются данные из таблицы-источника, таблицу-источник ни кто не мог изменить.
31 июл 17, 16:49    [20689004]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
А вы какой вариант предлагаете?
Использовать возможности системы, для чего их предварительно хоть немного изучить. 1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит, его таки проектировали не полные идиоты и про необходимость неизменности данных во время работы с ними они таки подумали.
31 июл 17, 17:10    [20689071]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
А вы какой вариант предлагаете?
Использовать возможности системы, для чего их предварительно хоть немного изучить. 1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит, его таки проектировали не полные идиоты и про необходимость неизменности данных во время работы с ними они таки подумали.


Поподробнее можете написать?
31 июл 17, 17:15    [20689091]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
ХД,

подробнее о чем Вы хотите узнать? Типы блокировок описаны в справке и не являются секретным знанием...
31 июл 17, 17:25    [20689130]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
ХД,

подробнее о чем Вы хотите узнать? Типы блокировок описаны в справке и не являются секретным знанием...


Хочу узнать что товарищ пытается сказать.

правильный проходящий.
1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит



SERIALIZABLE он имеет ввиду?

Может он что-то недопонял просто?
31 июл 17, 17:39    [20689188]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.
1 авг 17, 02:05    [20689919]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
982183
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.

Судя по описанию, ТС понимает,
что скопировать меньшую часть данных
и дропнуть исходную таблицу менее ресурсоемко, чем удалять, а вот ты - нет
1 авг 17, 06:40    [20689946]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
делайте свой перелив данных с tablockx:
begin tran
   select *
   into dbo.T2
   from dbo.T1 with(tablockx)
   where ... 

   drop table dbo.T1;
commit;

эксклюзивно залочите всю таблицу до конца транзакции
1 авг 17, 07:57    [20690010]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
982183
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.


Я бы с удовольствием.

Но вот удаление 95% данных из таблички, которая весит больше терабайта - занятие малоприятное и чреватое.
1 авг 17, 10:21    [20690416]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o
делайте свой перелив данных с tablockx:
begin tran
   select *
   into dbo.T2
   from dbo.T1 with(tablockx)
   where ... 

   drop table dbo.T1;
commit;

эксклюзивно залочите всю таблицу до конца транзакции




О, отлично, похоже то что нужно, большое спасибо!



TABLOCKX

Указывает, что монопольная блокировка таблицы применяется до конца транзакции.
1 авг 17, 10:24    [20690429]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?
1 авг 17, 10:28    [20690447]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
ХД
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?

нет конечно.
никому, кроме вашей сессии, доступна не будет.
а надо?
1 авг 17, 10:30    [20690464]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o
ХД
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?

нет конечно.
никому, кроме вашей сессии, доступна не будет.
а надо?


Хотелось бы.

ЧТобы они только читаьт могли, а изменить нет.

Читаю про TABLOCK, но как-то мутно написано. Однозначно понять не могу что они имели ввиду.

+
TABLOCK

Указывает, что на таблицу наложена блокировка, которая удерживается до окончания инструкции. При чтении данных накладывается совмещаемая блокировка. При изменении данных накладывается монопольная блокировка. Если при этом указан аргумент HOLDLOCK, совмещаемая блокировка таблицы удерживается до конца транзакции.

При использовании с массовым поставщиком наборов строк OPENROWSET для импорта данных в таблицу без индексов аргумент TABLOCK позволяет нескольким клиентам параллельно загружать данные в целевую таблицу с оптимизацией записи в журнал и блокировки.
1 авг 17, 10:32    [20690471]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
если надо, чтобы была доступной для чтения, то (TABLOCK, HOLDLOCK)
1 авг 17, 10:33    [20690473]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o
если надо, чтобы была доступной для чтения, то (TABLOCK, HOLDLOCK)


Благодарю!
1 авг 17, 10:33    [20690476]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
что именно непонятно в приведенной вами выше цитате?
TABLOCK наложит S на всю таблицу до окончания чтения,
но мы хотим до конца транзакции.
значит, нужен SERIALIZABLE,
HOLDLOCK это его синоним(на уровне таблицы).
итого, лепим пару хинтов (TABLOCK, HOLDLOCK)
1 авг 17, 10:38    [20690486]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
msLex
Member

Откуда:
Сообщений: 9074
o-o
SERIALIZABLE


Хмм, а ему точно SERIALIZABLE нужен? Может repetable read достаточно?


PS

Если база в RCSI, tablockx не будет мешать читателям в RC.
1 авг 17, 10:57    [20690609]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
ХД,

надо holdlock исчо.
Но это мертвому припарки, т.к. записи таблицы будет изменены немедленно после завершения транзакции другими пользователями и то, что Вы перенесли станет невалидным.
1 авг 17, 11:21    [20690770]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
msLex
Member

Откуда:
Сообщений: 9074
Владислав Колосов
записи таблицы будет изменены немедленно после завершения транзакции


так к концу транзакции не будет никакой таблицы.
1 авг 17, 11:24    [20690802]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

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

это жестко :) Я бы оставил таблицу на какое-то время с триггером, выдающим разъяснения.
1 авг 17, 11:27    [20690821]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
ХД
Но вот удаление 95% данных из таблички, которая весит больше терабайта - занятие малоприятное и чреватое.

Так это совсем другая задача.
Но чего тут "малоприятного" - не понимаю.
Да и "чреватого" не больше чем в способе с переносом большим данных.
Вот только не знаю, как физически делается pack в MS SQL
Как происходит удаление помеченных на удаление и уменьшение размера БД...
Если эта задача стоит
2 авг 17, 04:27    [20693399]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Другое дело, что DELETE неизбежно породит лог транзакции.
Которые в данном случае очевидно нах не нужны.
2 авг 17, 04:30    [20693400]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
iii2
Member

Откуда:
Сообщений: 202
982183
Другое дело, что DELETE неизбежно породит лог транзакции.
Которые в данном случае очевидно нах не нужны.

Ну так сделайте truncate, в чем проблема то?

Кстати, решение повесить триггер instead of insert, update, delete, который генерировал бы ошибку и выдавал сообщение "Идёт работы по обслуживанию, изменения данных запрещены, идите на фиг" - очень интересное, с т.з. поберечь нервы админа.
Надо взять на заметку.
2 авг 17, 16:23    [20695488]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
iii2
982183
Другое дело, что DELETE неизбежно породит лог транзакции.
Которые в данном случае очевидно нах не нужны.

Ну так сделайте truncate, в чем проблема то?


Сударь, вы упороты в своем ли уме?
2 авг 17, 16:42    [20695579]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
iii2
Ну так сделайте truncate, в чем проблема то?
.

Есть одна малюсенькая проблема в полном отсутствии данных после этой операции.
3 авг 17, 04:08    [20696648]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
iii2
Member

Откуда:
Сообщений: 202
ХД
iii2
пропущено...

Ну так сделайте truncate, в чем проблема то?


Сударь, вы упороты в своем ли уме?

Не понимаю.
Задача стояла - "небольшое количество данных спасти", остальное - удалить.
Ну и в чем проблема?
Спасаем данные в рядом стоящую таблицу. Причем это можно делать с минимальным логгированием (with tablock) таблицы приемника.
Делаем truncate большой таблицы.
Двигаем данные обратно.
Пересчитываем статистику.

Если в большой таблице, к примеру, миллиард записей, а спасти нужно миллионов 10 - то вышеприведенное решение лучшее, с т.з. всего :-)
3 авг 17, 08:23    [20696782]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Ну так топикстартер такой путь и избрал.
3 авг 17, 08:41    [20696817]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Вру.
Топикстартер думает (и наверно оправдано), что ALTER TABLE будет быстрее, чем обратная заливка данных.
3 авг 17, 08:45    [20696824]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
982183
Топикстартер думает (и наверно оправдано), что ALTER TABLE будет быстрее, чем обратная заливка данных.

если это про ALTER TABLE..SWITCH, то это доли секунды.
переключение метаданных.
---
но здесь же не ищут легких путей.
здесь I like to move it move it
(перельем туда, перельем обратно)

уже на все ответили, но гениальные идеи так и сыпятся
3 авг 17, 09:37    [20696945]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
iii2
Member

Откуда:
Сообщений: 202
o-o
982183
Топикстартер думает (и наверно оправдано), что ALTER TABLE будет быстрее, чем обратная заливка данных.

если это про ALTER TABLE..SWITCH, то это доли секунды.
переключение метаданных.
---
но здесь же не ищут легких путей.
здесь I like to move it move it
(перельем туда, перельем обратно)

уже на все ответили, но гениальные идеи так и сыпятся

Дык свитч-партишн работает только в энтерпрайз версии, это во-первых.
Во вторых - спасаемые данные, если они разбросаны по всей таблице - всё равно придется собрать в табличке рядом, чтобы потом включить в партиционированнцю таблицу.
Т.е. разница ровно в том, что спасенные данные можно передвинуть в общую таблицу после ее чистки переключением метаданных, а не перегонять из таблицы в таблицу.
Да, нормальное решение. Сэкономит примерно 1 минуту на 1-10 миллионах записей при наличии энтерпрайза.
Если операция регулярная - так и нужно делать.
3 авг 17, 10:07    [20697028]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
iii2
Дык свитч-партишн работает только в энтерпрайз версии, это во-первых.

у меня где-то про switch PARTITION?
глазки нужно протереть:
alter table...switch...
3 авг 17, 10:12    [20697046]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
iii2
Во вторых - спасаемые данные, если они разбросаны по всей таблице - всё равно придется собрать в табличке рядом, чтобы потом включить в партиционированнцю таблицу.

товарищ, остановись.
create table dbo.test_xxx(id int);
insert into dbo.test_xxx values(1), (2), (3);

select * into dbo.test_yyy from dbo.test_xxx where id = 1;
truncate table dbo.test_xxx;

alter table dbo.test_yyy switch to dbo.test_xxx;
select * from dbo.test_xxx;
3 авг 17, 10:19    [20697067]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
iii2
Member

Откуда:
Сообщений: 202
o-o
iii2
Во вторых - спасаемые данные, если они разбросаны по всей таблице - всё равно придется собрать в табличке рядом, чтобы потом включить в партиционированнцю таблицу.

товарищ, остановись.
create table dbo.test_xxx(id int);
insert into dbo.test_xxx values(1), (2), (3);

select * into dbo.test_yyy from dbo.test_xxx where id = 1;
truncate table dbo.test_xxx;

alter table dbo.test_yyy switch to dbo.test_xxx;
select * from dbo.test_xxx;

Ну нихрена ж себе!!! И в стандарте!!!
А с какой версии так работает?
А мы до сих пор поезда под откос пускаем... (С)

Спасибо, будем знать.
3 авг 17, 10:45    [20697160]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
так а с чего бы и нет?
ведь только само секционирование это Enterprise only feature.

с какой версии...ну наверное с 2005,
switch же под него сделали.

это же примерно как и PAGE COMPRESSION.
сама фича Энтерпрайзова,
но под нее сделали ALTER TABLE..REBUILD.
теперь можно ребилдить таблицы хоть в экспрессе,
просто без компрессии
3 авг 17, 11:00    [20697232]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
iii2
Member

Откуда:
Сообщений: 202
o-o
так а с чего бы и нет?
ведь только само секционирование это Enterprise only feature.

с какой версии...ну наверное с 2005,
switch же под него сделали.

это же примерно как и PAGE COMPRESSION.
сама фича Энтерпрайзова,
но под нее сделали ALTER TABLE..REBUILD.
теперь можно ребилдить таблицы хоть в экспрессе,
просто без компрессии

Но, по факту, для такого переключения, мы должны полностью воссоздать всю структуру целевой таблицы, правильно ведь?
Т.е. индексы, ключи, констрейнты и т.д.?
Оно даст переключить при наличии декларативных ссылочных связей, или, например, при наличии материализованных представлений, построенных на таблице?
Ограничение, видимо, как при переключении секций?
Нужно покопать...

Еще раз спасибо. Как то отложилось, что все переключения - это энтерпрайз.
А ALTER TABLE..REBUILD, да, в админской практике постоянно использую.
3 авг 17, 11:12    [20697289]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
iii2
Но, по факту, для такого переключения, мы должны полностью воссоздать всю структуру целевой таблицы, правильно ведь?
Т.е. индексы, ключи, констрейнты и т.д.?
Оно даст переключить при наличии декларативных ссылочных связей, или, например, при наличии материализованных представлений, построенных на таблице?
Ограничение, видимо, как при переключении секций?

конечно, таблицы должны быть идентичны по структуре.
но ведь он и собирается потом новую использовать как старую,
так что по-любому все индексы придется навесить заново.
3 авг 17, 11:34    [20697375]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
msLex
Member

Откуда:
Сообщений: 9074
o-o
конечно, таблицы должны быть идентичны по структуре

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

на конечной таблице могут отсутствовать индексы и констрейнты исходной, а вот обратное невозможно

-- создаем две таблицы идентичной структуры 
create table dbo.Swtich_Source (
	a int not null
	, b int not null
)



create table dbo.Swtich_Target (
	a int not null
	, b int not null
)


create clustered index i on dbo.Swtich_Source(a)
create clustered index i on dbo.Swtich_Target(a)
go



-- добавляем в исходную таблицу индекс и check, которых не будет в конечной 
create index i1 on dbo.Swtich_Source(b)
alter table dbo.Swtich_Source add constraint ch check  (b > 2)




-- switch из Source таблицы в  Target работает
alter table dbo.Swtich_Source switch to dbo.Swtich_Target

-- а обратный switch из Target в Source уже нет
alter table dbo.Swtich_Target switch to dbo.Swtich_Source

go


drop table dbo.Swtich_Source
drop table dbo.Swtich_Target
3 авг 17, 12:28    [20697542]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
msLex
o-o
конечно, таблицы должны быть идентичны по структуре

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

если понимать в контексте этой темы, то таблицы должны быть идентичны
3 авг 17, 12:46    [20697591]     Ответить | Цитировать Сообщить модератору
 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft SQL Server Ответить