Могу ли я изменить секционированную таблицу в SQL Server 2005? - PullRequest
1 голос
/ 19 января 2009

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

Можно ли добавить / удалить столбцы многораздельной таблицы?

Требуются ли специальные шаги, потому что он разделен?

Ответы [ 2 ]

2 голосов
/ 20 января 2009

В дополнение к выполнению операций SWITCH, которые включают в себя многораздельные таблицы, ALTER TABLE может использоваться для изменения состояния столбцов, ограничений и триггеров многораздельной таблицы так же, как она используется для неразделенных таблиц. Однако этот оператор нельзя использовать для изменения способа разбиения самой таблицы. Чтобы перераспределить разделенную таблицу, используйте ALTER PARTITION SCHEME и ALTER PARTITION FUNCTION. Кроме того, вы не можете изменить тип данных столбца многораздельной таблицы.

Подробнее здесь: http://technet.microsoft.com/en-us/library/ms190273.aspx

1 голос
/ 20 января 2009

Я не смог найти однозначного ответа (я нашел документ @ E.J. Бреннан, на который ссылаются, немного плотный и неясный). Поэтому я добавил к этот пример и проверил, что да, вы можете добавлять / удалять столбцы :

USE adventureworks
go

create partition function YearPF(datetime) as range right for values ('20050101');

-- Now we need to add filegroups that will contains partitioned values
alter database adventureworks add filegroup YearFG1;
alter database adventureworks add filegroup YearFG2;

-- Now we need to add file to filegroups
alter database adventureworks add file (name = 'YearF1', filename = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdvWorksF1.ndf') to filegroup YearFG1;
alter database adventureworks add file (name = 'YearF2', filename = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdvWorksF2.ndf') to filegroup YearFG2;

-- Here we associate the partition function to 
-- the created filegroup via a Partitioning Scheme
create partition scheme YearPS as partition YearPF to (YearFG1, YearFG2)

-- Now just create a table that uses the particion scheme
create table PartitionedOrders
(
  Id int not null identity(1,1),
  DueDate DateTime not null,
) on YearPS(DueDate)

-- And now we just have to use the table!
insert into PartitionedOrders values('20020101')
insert into PartitionedOrders values('20030101')
insert into PartitionedOrders values('20040101')
insert into PartitionedOrders values('20050101')
insert into PartitionedOrders values('20060101')

-- Now we want to see where our values has falled
select *, $partition.YearPF(DueDate) from PartitionedOrders

-- see if we can add a column
ALTER TABLE PartitionedOrders ADD NewColumn INT NULL

-- add some more records, populating the new column
insert into PartitionedOrders values('20010101', 1)
insert into PartitionedOrders values('20070101', 2)

-- see that they were inserted properly
select *, $partition.YearPF(DueDate) from PartitionedOrders

ALTER TABLE PartitionedOrders DROP COLUMN NewColumn

-- see that the column dropped
select *, $partition.YearPF(DueDate) from PartitionedOrders

/* clean up
drop table PartitionedOrders
drop partition scheme YearPS;
drop partition function YearPF;
alter database adventureworks remove file YearF1;
alter database adventureworks remove file YearF2;
alter database adventureworks remove  filegroup YearFG1;
alter database adventureworks remove filegroup YearFG2;
*/
...