Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 partitioning  [new]
# do diezz #
Guest
Есть огроооомная секционированная по месяцам таблица. Надо из одной партиции грохнуть процентов 95 данных. Как лучше?
16 мар 15, 16:08    [17390286]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
DELETE TOP(95) PERCENT from табле where ...
16 мар 15, 16:27    [17390410]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Winnipuh
DELETE TOP(95) PERCENT from табле where ...


а как эффективнее?

alter table pt switch partition 2 to table tt;
go

insert into pt
select * from tt where ... /* предикат, возвращающий те самые 5% */
go

drop table tt;


как вам такое решение?
16 мар 15, 16:31    [17390437]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Crimean
Member

Откуда:
Сообщений: 13147
# do diezz #,

если получится сделать switch то так конечно эффективнее. только ограничений много, не всегда это возможно
16 мар 15, 16:46    [17390542]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4538
Winnipuh
DELETE TOP(95) PERCENT from табле where ...

жжошь, однако!!!
16 мар 15, 16:52    [17390591]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
# do diezz #,

А данных в партиции сколько всего?
И 95% это TOP (95) PERCENT как тут написали или это по условию WHERE ... получается, что ему удовлетворяют 95% .

Если объёмы большие > 1 ляма на партиции, то есть смысл удалять порциями.

WHILE 1 = 1
BEGIN 
DELETE TOP 100000 FROM T WHERE ...<условие 95%>. ;
IF @@ROWCOUNT = 0 BREAK;
END 


Если это 95%, то можно и так извернуться WHERE ID % 100 < 95 типа TOP 95%
16 мар 15, 17:00    [17390678]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Crimean
# do diezz #,

если получится сделать switch то так конечно эффективнее. только ограничений много, не всегда это возможно


вроде только разместить таблицу приемник в той же filegroup? доп место тратиться не будет. это ж операция метаданных. я ведь назад switch не делаю (потому check constraint не нужен вроде...)
16 мар 15, 17:01    [17390693]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
# do diezz #
Winnipuh
DELETE TOP(95) PERCENT from табле where ...


а как эффективнее?

alter table pt switch partition 2 to table tt;
go

insert into pt
select * from tt where ... /* предикат, возвращающий те самые 5% */
go

drop table tt;


как вам такое решение?


Это вы типа создали новую таблицу с 95%. Проверьте, будет ли быстрее.
16 мар 15, 17:03    [17390699]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
a_voronin
# do diezz #
пропущено...


а как эффективнее?

alter table pt switch partition 2 to table tt;
go

insert into pt
select * from tt where ... /* предикат, возвращающий те самые 5% */
go

drop table tt;


как вам такое решение?


Это вы типа создали новую таблицу с 95%. Проверьте, будет ли быстрее.


иногда, лучше читать, чем говорить. это типа поменял в метаданных ссылку на первые страницы IAM-цепочек для 3-х allocation unit'ов: IN_ROW, OVERFLOW, LOB.
16 мар 15, 17:06    [17390719]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Crimean
Member

Откуда:
Сообщений: 13147
# do diezz #,

а индексы все выровненные?
16 мар 15, 17:10    [17390741]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Exproment
Member

Откуда:
Сообщений: 418
# do diezz #, вы очень странно описали решение :) Но оно единственно верное и есть.

1) Создаем новую таблицу(секцию) в той же файловой группе
2) Переносим 5% данных в новую таблицу. Желательно с минимальным протоколированием.
3) Удаляем старую секцию
4) Новую таблицу переносим на место старой(switch)

Никакого delete тут и быть не должно! Только минимально протоколируемые insert, truncate, switch. Как уж это реализовать - решать вам :)
16 мар 15, 17:11    [17390753]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Crimean
# do diezz #,

а индексы все выровненные?


достаточно посоздавать для таблицы получателя индексы в тех же файловых группах что и партиции индексов источника. тоже места ссылки на их IAM-цепочки переключатся и все.
16 мар 15, 17:13    [17390760]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Exproment
# do diezz #, вы очень странно описали решение :) Но оно единственно верное и есть.

1) Создаем новую таблицу(секцию) в той же файловой группе
2) Переносим 5% данных в новую таблицу. Желательно с минимальным протоколированием.
3) Удаляем старую секцию
4) Новую таблицу переносим на место старой(switch)

Никакого delete тут и быть не должно! Только минимально протоколируемые insert, truncate, switch. Как уж это реализовать - решать вам :)


Я не то же самое предложил :)?

17390437
16 мар 15, 17:15    [17390776]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SQL2008
Winnipuh
DELETE TOP(95) PERCENT from табле where ...

жжошь, однако!!!


што?
16 мар 15, 17:19    [17390798]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Exproment
Member

Откуда:
Сообщений: 418
# do diezz #, да, тоже самое. Только в виде какого-то абстрактного кода и не слова о минимальном проколировании insert'а
16 мар 15, 17:21    [17390813]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Exproment
# do diezz #, да, тоже самое. Только в виде какого-то абстрактного кода и не слова о минимальном проколировании insert'а


А у вас в виде не абстрактных слов, стало быть? (уж о tran log'е я знаю если не все, то многое).

В случае, если источник - кластерная таблица, ваша последовательность лучше моей. При моей последовательности, insert...select... не будет minimally loged.
16 мар 15, 17:36    [17390914]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Crimean
Member

Откуда:
Сообщений: 13147
# do diezz #
Crimean
# do diezz #,

а индексы все выровненные?


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


если есть UNIQUE индексы, для которых не получилось ключ секционирования включить в keys - будут проблемы
в остальных случаях - можно выкрутиться. я именно об этом пытался сказать
16 мар 15, 17:40    [17390948]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Crimean
# do diezz #
пропущено...


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


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


спасибо большое! такого случая нет.
16 мар 15, 17:44    [17390972]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Crimean
Member

Откуда:
Сообщений: 13147
# do diezz #
спасибо большое! такого случая нет.


а вот у меня есть :) ПК и один уник не получилось "попилить". благо они слабо вырождаются. то есть на индексации хороший профит все равно. вот и предупреждаю.
16 мар 15, 17:48    [17390997]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Уточню, можно постоянно держать специальную таблицу - копию оригинальной, делать SWITCH, потом TRUNCATE. DROP делать не обязательно. Мы так делаем.
16 мар 15, 17:54    [17391040]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Собсна, только недавно чистил так таблицу.

270 дней - это кол-во дней, за которые необходимо сохранить данные.

declare @boundary_id int, @boundary datetime;

select top 1 @boundary_id = prv.boundary_id, @boundary = cast(prv.value as datetime)
from	sys.tables t
	inner join sys.indexes i ON i.object_id = t.object_id and i.type = 1
	inner join sys.partitions p ON p.object_id = t.object_id AND p.index_id = i.index_id
	left  join sys.partition_schemes ps
		on t.lob_data_space_id = ps.data_space_id
	left  join sys.partition_range_values prv
		on ps.function_id = prv.function_id
		and prv.boundary_id = p.partition_number
where t.name = '<моя таблица>'
and  datediff(day, cast(prv.value as datetime), getdate()) > 270
order by prv.boundary_id asc;

while @boundary_id is not null
begin

	alter table <моя таблица> switch partition @boundary_id to <моя временная таблица>;

	truncate table <моя временная таблица>;

	alter partition function <функция партиционирования моей таблицы>() merge range (@boundary);

	select @boundary_id = null, @boundary = null;

	select	top 1 @boundary_id = prv.boundary_id, @boundary = cast(prv.value as datetime)
	from	sys.tables t
		inner join sys.indexes i ON i.object_id = t.object_id and i.type = 1
		inner join sys.partitions p ON p.object_id = t.object_id AND p.index_id = i.index_id
		left  join sys.partition_schemes ps
			on t.lob_data_space_id = ps.data_space_id
		left  join sys.partition_range_values prv
			on ps.function_id = prv.function_id
			and prv.boundary_id = p.partition_number
	where t.name = '<моя таблица>'
	and  datediff(day, cast(prv.value as datetime), getdate()) > 270
	order by prv.boundary_id asc;

end;
16 мар 15, 17:59    [17391072]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
# do diezz #
Guest
Minamoto, спасибо большое.
16 мар 15, 18:03    [17391105]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4538
Winnipuh
SQL2008
пропущено...

жжошь, однако!!!


што?

Блин! Отстал от жизни!
Я думал прикалываешься...
А может так можно
TRUNCATE TOP (95) PERCENT TABLE

или

INNER JOIN (95) PERCENT ...


или
GRANT (95) PERCENT PERMISSION ...


Не вижу смысла в случайном удалении 95% записей!!!
16 мар 15, 18:04    [17391110]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SQL2008
Winnipuh
пропущено...


што?

Блин! Отстал от жизни!
Я думал прикалываешься...
А может так можно
TRUNCATE TOP (95) PERCENT TABLE

или

INNER JOIN (95) PERCENT ...


или
GRANT (95) PERCENT PERMISSION ...


Не вижу смысла в случайном удалении 95% записей!!!



ну, почему, а освободить место?
16 мар 15, 18:05    [17391121]     Ответить | Цитировать Сообщить модератору
 Re: partitioning  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
# do diezz #, сразу предупрежу, быстро будет работать, если функция - RANGE LEFT.

Если там RANGE RIGHT, то каждый MERGE будет вызывать переливание данных из крайней секции в пустую, т.е. будет затратно по времени. Для такого варианта можно поправить скрипт, начинать не снизу, а сверху удаление. В общем, попробуйте, поэкспериментируйте.
16 мар 15, 18:08    [17391130]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить