使用 SQL Server 2016+
我有一个需要分区的产品表。它当前有一个主身份键,用作全文索引搜索的一部分。我们需要对表进行分区,该字段不是主键(分区 ID),以帮助导入数据并将数据分离到多个驱动器上。下面的示例是一个简单的案例,分区全部位于主分区上,但足以演示。
DROP TABLE IF EXISTS dbo.Products
BEGIN TRY DROP PARTITION SCHEME division_id_scheme END TRY BEGIN CATCH END CATCH
BEGIN TRY DROP PARTITION FUNCTION division_id_function END TRY BEGIN CATCH END CATCH
BEGIN TRY DROP FULLTEXT CATALOG ProductNames END TRY BEGIN CATCH END CATCH
CREATE PARTITION FUNCTION division_id_function ( INT ) AS RANGE LEFT FOR VALUES ( 1, 2, 3 )
CREATE PARTITION SCHEME division_id_scheme AS PARTITION division_id_function ALL TO ( [PRIMARY] )
CREATE TABLE dbo.Products ( ID INT IDENTITY(1, 1)
, Catalogueref NVARCHAR(50) NOT NULL
, ProductName NVARCHAR(255) NOT NULL
, DivisionID INT NOT NULL
, CONSTRAINT pk_Products PRIMARY KEY ( DivisionID, ID )) ON division_id_scheme (DivisionID);
INSERT INTO dbo.Products ( Catalogueref, ProductName, DivisionID )
VALUES ( N'ABC123', N'Product Apple', 1 )
, ( N'ABC124', N'Product Ball', 1 )
, ( N'ABC125', N'Product Cat', 2 )
, ( N'ABC126', N'Product Dog', 2 )
, ( N'ABC127', N'Product Egg', 3 )
, ( N'ABC128', N'Product Fox', 3 )
, ( N'ABC129', N'Product Grape', 3 )
SELECT * FROM dbo.Products
这将完全按照预期创建和分区表。当我们尝试创建全文索引时,问题就出现了。全文索引需要针对单个列定义的唯一键。
CREATE FULLTEXT CATALOG ProductNames
--This Fails because pk_Products is not a single column unique index
CREATE FULLTEXT INDEX ON dbo.Products (ProductName) KEY INDEX pk_Products ON ProductNames
Msg 7653, Level 16, State 2, Line 29
'pk_Products' is not a valid index to enforce a full-text search key. A full-text search key must be a unique, non-nullable, single-column index which is not offline, is not defined on a non-deterministic or imprecise nonpersisted computed column, does not have a filter, and has maximum size of 900 bytes. Choose another index for the full-text key.
但是,我们无法针对单个列创建唯一键,因为我们需要主键中的两列进行分区。
-- This fails because unique index must be a subset of the index (which is multi-column)
DROP INDEX IF EXISTS ui_CatRef ON dbo.Products
CREATE UNIQUE NONCLUSTERED INDEX ui_CatRef ON dbo.Products (Catalogueref)
主键中需要 DivisionID 和 ID,因为 Division ID 不是唯一的,而是我们对数据进行分区的方式。我们已经尝试了多种选择,包括:
两者作为唯一索引都必须包含分区字段。
任何关于如何按分区进行分区,但仍保留全文搜索主键的建议都将受到热烈欢迎。
您可以在主文件组上创建唯一索引来避免此问题:
CREATE UNIQUE NONCLUSTERED INDEX ui_CatRef ON dbo.Products (id) on [primary]
CREATE FULLTEXT INDEX ON dbo.Products (ProductName) KEY INDEX ui_CatRef ON ProductNames
我不得不说,这个解决方案对我来说有点hacky,所以请确保它不会导致任何意想不到的后果