如果表是水平分区的,可以通过主键查询吗?

时间:2016-07-31 14:49:10

标签: sql sql-server sql-server-2014

我有一张看起来像这样的表

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如何知道要查询的分区?

2 个答案:

答案 0 :(得分:0)

WHERE子句谓词中未指定分区列时,需要触及每个分区。如果存在合适的索引,则可以执行针对每个分区的搜索而不是扫描。额外的开销取决于分区的数量和b树索引的深度。使用单例查找,与非分区表相比,性能会更差。

但请注意,SQL Server要求分区列是所有唯一索引的一部分,包括主键。因此,如果对哈希值进行分区,则如果主键是分区的,则哈希将需要是主键的一部分。要仅在id上实现主键约束,不得对PK索引进行分区。

您提到customer_id将在多台计算机上进行哈希处理。您是说您计划跨多个服务器对表进行分区?

答案 1 :(得分:0)

使用此字段时,您的查询仍将使用聚簇索引扫描。由于索引未分区,因此该索引很可能存在于PRIMARY文件组中。您将无法在分区特定功能中使用它,因为它不在分区文件组中。但是,它会像常规索引一样运行。

有一点需要注意的是,您的主数据文件很可能会包含整个索引,如果它的备份变得非常大,那么随着时间的推移会有更长的时间。