Sql 如果表是水平分区的,是否可以按主键查询?

Sql 如果表是水平分区的,是否可以按主键查询?,sql,sql-server,sql-server-2014,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 (

我有一张像这样的桌子

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\u id
进行水平分区。我可以这样查询这个分区表吗

select * 
from mytable 
where id = 6709

如您所见,我没有在查询中包含
客户id
。如果我像这样查询表,会有性能损失吗?SQL Server如何知道要查询哪个分区?

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

但是,请注意,SQL Server要求分区列是所有唯一索引(包括主键)的一部分。因此,如果根据散列值进行分区,则如果主键已分区,则散列将需要成为主键的一部分。要单独对
id
实施主键约束,PK索引不得分区


您提到客户id将在多台计算机上进行散列。您是说您计划在多个服务器之间对表进行分区吗?

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

但是,请注意,SQL Server要求分区列是所有唯一索引(包括主键)的一部分。因此,如果根据散列值进行分区,则如果主键已分区,则散列将需要成为主键的一部分。要单独对
id
实施主键约束,PK索引不得分区


您提到客户id将在多台计算机上进行散列。您是说您计划在多个服务器上对表进行分区吗?

使用此字段时,您的查询仍将使用聚集索引扫描。此索引很可能位于主文件组中,因为该索引未分区。您将无法在分区特定的函数中使用它,因为它不在分区文件组中。但是,它的行为将类似于常规索引


需要注意的一点是,您的主数据文件很可能包含整个索引,如果它变得非常大,您的备份和其他备份将花费更长的时间。

使用此字段时,您的查询仍将使用聚集索引扫描。此索引很可能位于主文件组中,因为该索引未分区。您将无法在分区特定的函数中使用它,因为它不在分区文件组中。但是,它的行为将类似于常规索引


需要注意的一点是,您的主数据文件很可能包含整个索引,如果它变得非常大,您的备份和其他备份将花费更长的时间。

我猜是的。。。您必须对每个分区分别进行索引扫描,以找到正确的客户id。优化器没有任何关于哪个PK在哪个分区上的提示,因为该分区位于不同的列上。它将检查所有分区,但您当然可以运行查询。它不需要进行扫描,因为它可以在索引中快速找到数据。“此表将通过在多台计算机上散列客户id来进行水平分区”那么您将如何做到这一点?没有一个确切的解释你心目中的计划,这个问题是无法回答的。我的猜测是肯定的。。。您必须对每个分区分别进行索引扫描,以找到正确的客户id。优化器没有任何关于哪个PK在哪个分区上的提示,因为该分区位于不同的列上。它将检查所有分区,但您当然可以运行查询。它不需要进行扫描,因为它可以在索引中快速找到数据。“此表将通过在多台计算机上散列客户id来进行水平分区”那么您将如何做到这一点?如果不解释您心目中的具体方案,则无法回答此问题。是的,我计划在多个服务器上对表进行分区。您计划如何在多个服务器上访问表?使用链接服务器的联合所有视图?是的,我计划在多个服务器之间对表进行分区。您计划如何在多个服务器之间访问表?使用链接服务器的联合所有视图?