【发布时间】:2015-05-25 05:47:01
【问题描述】:
我发现的所有表分区示例都非常简单,但我需要按一个标准对许多表进行分区。
例如,我有表:Contractors 和 Products,其中 Products 表中的 ContractorId 是外键。
我为 ContractorId 创建了函数和架构。它适用于 Contractors 表,但对于 Products 表...
我不知道我应该如何使用它,因为当我尝试时,我总是得到信息:“为聚集索引 'PK_dbo.Products' 指定的文件组 'PRIMARY' 用于表 'dbo.Products' 即使分区为它指定了方案'scheme_Contractors'”。我的产品表如下所示:
CREATE TABLE [dbo].[Products](
[ProductId] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[Amount] [int] NULL,
[Color] [nvarchar](max) NULL,
[Price] [decimal](18, 2) NULL,
[Guarantee] [nvarchar](max) NULL,
[GuaranteeType] [int] NULL,
[AdditionalFeatures] [nvarchar](max) NULL,
[Valid] [bit] NULL,
[ContractorId] [int] NOT NULL,
[ProducerId] [int] NOT NULL,
[ProductCategoryId] [int] NOT NULL,
CONSTRAINT [PK_dbo.Products] PRIMARY KEY ( [ProductId] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] )
GO
ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_dbo.Products_dbo.Contractors_ContractorId] FOREIGN KEY([ContractorId])
REFERENCES [dbo].[Contractors] ([ContractorId])
GO
ALTER TABLE [dbo].[Products] CHECK CONSTRAINT [FK_dbo.Products_dbo.Contractors_ContractorId]
GO
谁能告诉我 - 是否可以在 ContractorId 列上使用我的架构以及如何使用?提前谢谢!
【问题讨论】:
-
我认为您需要为每个表单独的分区功能。
-
但是如果我想按 CustomerId 分区有什么区别?因此,对于 Products 表,我无法编写依赖于其主键 (ProductId) 的分区函数和模式。不幸的是,问题仍然存在。
-
分区列 (ContractorId) 必须是所有唯一索引键的一部分,包括主键。如果您不希望 ContractorId 作为 PK 的一部分并且想要对表进行分区,您可以在 ContractorId 和 ProductId 上创建一个唯一的复合聚集索引,并将主键索引更改为非聚集索引而不对该索引进行分区。很大程度上取决于您进行分区的原因。
-
非常感谢您的评论。很有帮助。
标签: sql sql-server partitioning database-partitioning