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

Откуда: Чебаркуль
Сообщений: 4188
Есть таблица, заполняемая данными и с вычисляемым полем expired.
Из-за частого обращения с выборками из этой таблицы я не удаляю данные каждый раз, а надо бы.

Нельзя ли удалять экспайред записи используя alter table old swtich to new?
То есть - перебросить в new только не экспайред записи и продолжать работать

Так переключиться можно, но при этом естественно все записи мигрируют

drop table old
drop table new

create table old(id int identity, data nvarchar(256), expired int not null default(0))
insert into old(data,expired) select N'data1',1
insert into old(data,expired) select N'data2',0
insert into old(data,expired) select N'data3',0

select * into new from old where expired=0
select * from old
select * from new

alter table old switch to new

select * from old
select * from new
29 июн 16, 17:17    [19351155]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
msLex
Member

Откуда:
Сообщений: 9308
А какая цель "switch-а"? Удалять старые записи?
29 июн 16, 17:38    [19351249]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4188
msLex
А какая цель "switch-а"? Удалять старые записи?


Если удалять в той же таблице она блокируется и будут дедлоки, к ней часто обращаются
Вот и хотелось бы как-то хитро избавиться от экспайред. Если бы были все экспайред, то было бы немного проще, а так в общем случае всегда смесь
29 июн 16, 17:48    [19351303]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
msLex
Member

Откуда:
Сообщений: 9308
Ролг Хупин
msLex
А какая цель "switch-а"? Удалять старые записи?


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

секционируйте свою таблицу по полю expired, и периодически "отсвитчивайте" ее и транкейтьте
create partition function pf_bit (bit)
as range right for values(1)
go

create partition scheme ps_expired
as partition pf_bit all to ([primary])


create table dbo.t(id int, expired bit not null)


create clustered index id on dbo.t(id) on ps_expired (expired)



create table dbo.t_switch(id int, expired bit not null)
create clustered index id on dbo.t_switch(id) on ps_expired (expired)


alter table dbo.t switch partition 1 to dbo.t_switch partition 1


truncate table dbo.t_switch 
29 июн 16, 17:55    [19351325]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4188
msLex
Ролг Хупин
пропущено...


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

секционируйте свою таблицу по полю expired, и периодически "отсвитчивайте" ее и транкейтьте
create partition function pf_bit (bit)
as range right for values(1)
go

create partition scheme ps_expired
as partition pf_bit all to ([primary])


create table dbo.t(id int, expired bit not null)


create clustered index id on dbo.t(id) on ps_expired (expired)



create table dbo.t_switch(id int, expired bit not null)
create clustered index id on dbo.t_switch(id) on ps_expired (expired)


alter table dbo.t switch partition 1 to dbo.t_switch partition 1


truncate table dbo.t_switch 


В общем да, но есть пара "но"

1. а если такое поле

expired AS (case when datediff(second,created,getdate())>(10) then (1) else (0) end)

2. а если не Enterprise Edition?
29 июн 16, 18:08    [19351393]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Ролг Хупин
В общем да, но есть пара "но"

1. а если такое поле

expired AS (case when datediff(second,created,getdate())>(10) then (1) else (0) end)


Это вычисление не имеющее отношение к физической структуре хранения.

Ролг Хупин
2. а если не Enterprise Edition?


партиционирование только на Enterprise и Developer

https://msdn.microsoft.com/en-us/library/cc645993.aspx
29 июн 16, 18:38    [19351519]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
msLex
Member

Откуда:
Сообщений: 9308
Ролг Хупин
В общем да, но есть пара "но"

1. а если такое поле

expired AS (case when datediff(second,created,getdate())>(10) then (1) else (0) end)


Тогда ничего не выйдет, такое вычисляемое поле нельзя сделать persisted т.к. getdate() недетерминированная функция, а только persisted вычисляемые поля могут выступать в качестве ключей секционирования.


Можно секционировать вашу таблицу по created, и отсвитчивать устаревшие секции.
29 июн 16, 20:30    [19351837]     Ответить | Цитировать Сообщить модератору
 Re: Alter table switch to: можнго ли так сделать?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4188
msLex
Ролг Хупин
В общем да, но есть пара "но"

1. а если такое поле

expired AS (case when datediff(second,created,getdate())>(10) then (1) else (0) end)


Тогда ничего не выйдет, такое вычисляемое поле нельзя сделать persisted т.к. getdate() недетерминированная функция, а только persisted вычисляемые поля могут выступать в качестве ключей секционирования.


Можно секционировать вашу таблицу по created, и отсвитчивать устаревшие секции.


тоже вариант
30 июн 16, 19:22    [19356710]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить