对外键引用的表进行分区

Raj*_*tel 6 foreign-key sql-server partitioning sql-server-2012

我有一张桌子:

CREATE TABLE [dbo].[entry]
(
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [EntryDate] [datetime] NOT NULL,
    [createddate] [datetime] NOT NULL,

    CONSTRAINT [PK_Entry_ID] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )
    WITH
    (
        PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80
    ) ON [PRIMARY]
) ON [PRIMARY];
Run Code Online (Sandbox Code Playgroud)

...其中主键被另一个表引用。为了对这个表进行分区,我已经完成了以下步骤:

 CREATE PARTITION FUNCTION EntryFunc (DATE) 
   AS RANGE LEFT
   FOR VALUES ('2011-01-01')


  CREATE PARTITION SCHEME EntryScheme
    AS PARTITION EntryFunc
    TO ([FileGroup2], [PRIMARY])
Run Code Online (Sandbox Code Playgroud)

以上 2 个步骤成功完成,但是当我对表进行分区时,我无法删除主键聚集索引,因为它被其他表引用。我的动机是根据创建日期对表条目进行分区。

Kin*_*hah 5

来自 BOL ( http://technet.microsoft.com/en-us/library/ms191160(v=sql.105).aspx )

源表和目标表必须具有相同的 FOREIGN KEY 约束。如果目标表有任何 FOREIGN KEY 约束,则源表必须具有在相应列上定义的相同外键,并且这些外键必须引用与目标表相同的主键。源表的外键不能标记为is_not_trusted(在sys.foreign_keys目录视图中可以查看),除非目标表对应的外键也标记为is_not_trusted。 

所以如果你想对一个外键引用的表进行分区,那么两个表都需要有相同的FK。

同样对于快速分区,以下规则适用:

你不能使用 fk 的

如果源表具有主键,则未定义主键/外键。源表和源表保存主键的目标表之间不能存在活动的主键/外键关系。

如果目标表具有外键,则未定义主键/外键。源表和目标表保存外键的目标表之间不能有活动的主键/外键关系。

来自另一个表的任何外键都不能引用源表。源表不能被另一个表中的外键引用。

因此,您必须删除约束,对表进行分区并重新创建成本约束。最好作为一个事务来做,所以成功时它可以提交,或者失败时它可以回滚。

可以在以下位置找到分步教程:http : //www.mssqltips.com/sqlservertip/2888/how-to-partition-an-existing-sql-server-table/

http://www.confio.com/logicalread/sql-server-primary-key-vs-clustered-index,-part-3/#.Ui1lNGIpDFo