SQL Server 分区表和全文索引

问题描述 投票:0回答:1

使用 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 不是唯一的,而是我们对数据进行分区的方式。我们已经尝试了多种选择,包括:

  • 根据 ID 添加计算列
  • 添加普通列并手动填充值以复制 ID

两者作为唯一索引都必须包含分区字段。

任何关于如何按分区进行分区,但仍保留全文搜索主键的建议都将受到热烈欢迎。

sql sql-server full-text-search partitioning
1个回答
0
投票

您可以在主文件组上创建唯一索引来避免此问题:

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,所以请确保它不会导致任何意想不到的后果

© www.soinside.com 2019 - 2024. All rights reserved.