我有一张看起来像这样的表
CREATE TABLE mytable
(
id int IDENTITY(1,1) NOT NULL,
customer_id [int] NOT NULL,
blessdate date NOT NULL,
value1 varchar(max) NULL,
value2 varchar(max) NULL
CONSTRAINT [PK_History]
PRIMARY KEY CLUSTERED ([id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
) ON [PRIMARY]
此表将通过在几台计算机上散列customer_id
进行水平分区。我可以像这样查询这个分区表吗?
select *
from mytable
where id = 6709
如您所见,我在查询中未包含customer_id
。如果我这样查询表会有性能损失吗? SQL Server如何知道要查询的分区?
答案 0 :(得分:0)
在WHERE
子句谓词中未指定分区列时,需要触及每个分区。如果存在合适的索引,则可以执行针对每个分区的搜索而不是扫描。额外的开销取决于分区的数量和b树索引的深度。使用单例查找,与非分区表相比,性能会更差。
但请注意,SQL Server要求分区列是所有唯一索引的一部分,包括主键。因此,如果对哈希值进行分区,则如果主键是分区的,则哈希将需要是主键的一部分。要仅在id
上实现主键约束,不得对PK索引进行分区。
您提到customer_id将在多台计算机上进行哈希处理。您是说您计划跨多个服务器对表进行分区?
答案 1 :(得分:0)
使用此字段时,您的查询仍将使用聚簇索引扫描。由于索引未分区,因此该索引很可能存在于PRIMARY文件组中。您将无法在分区特定功能中使用它,因为它不在分区文件组中。但是,它会像常规索引一样运行。
有一点需要注意的是,您的主数据文件很可能会包含整个索引,如果它的备份变得非常大,那么随着时间的推移会有更长的时间。