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

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


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


PS

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

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

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

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


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

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

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

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

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

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

Откуда: VL
Сообщений: 3352
Вру.
Топикстартер думает (и наверно оправдано), что 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

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