Sql server 是否基于不在主键中的列对SQL Server表进行分区?
假设我有一张这样的桌子:Sql server 是否基于不在主键中的列对SQL Server表进行分区?,sql-server,Sql Server,假设我有一张这样的桌子: create table test_partitions ( pk_id int not null, col1 nvarchar(20), col2 nvarchar(100), constraint pk_test_partitions primary key (pk_id, col1) ); 我想对这个表进行分区以提高查询性能,这样我就不必在每次需要某些东西时都查看整个表。因此,我添加了一个计算列: create table t
create table test_partitions
(
pk_id int not null,
col1 nvarchar(20),
col2 nvarchar(100),
constraint pk_test_partitions primary key (pk_id, col1)
);
我想对这个表进行分区以提高查询性能,这样我就不必在每次需要某些东西时都查看整个表。因此,我添加了一个计算列:
create table test_partitions
(
pk_id int not null,
partition_id as pk_id % 10 persisted not null,
col1 nvarchar(20),
col2 nvarchar(100),
constraint pk_test_partitions primary key (pk_id, col1)
);
因此,每当我从pk_id=123的test_分区中选择*时,我希望SQL Server只查看整个表的十分之一。我不想将
partition\u id
列添加到主键,因为它永远不会是where子句的一部分。如何在分区\u id
上对表进行分区?刚才我做了测试并找到了解决方案
SELECT TOP ((SELECT COUNT(*) [TABLE_NAME])/10)
* FROM [TABLE_NAME]
它返回您记录的十分之一刚才我做了测试并找到了解决方案
SELECT TOP ((SELECT COUNT(*) [TABLE_NAME])/10)
* FROM [TABLE_NAME]
它将返回十分之一的记录为了提高查询性能,您可以应用分页。也就是说,您可以使用获取下一个查询来实现输出。 请通读更多细节
SELECT column-names FROM table-name
ORDER BY column-names
OFFSET n ROWS
FETCH NEXT m ROWS ONLY
要提高查询性能,可以应用分页。也就是说,您可以使用获取下一个查询来实现输出。 请通读更多细节
SELECT column-names FROM table-name
ORDER BY column-names
OFFSET n ROWS
FETCH NEXT m ROWS ONLY
您不需要对其进行分区。您只需要添加一个非聚集索引。要查看是否正在使用索引/分区,请检查查询计划。如果主键具有前导列
pku id
,则不需要额外的非聚集索引或任何分区(如图所示)上面的聚集索引将允许您的谓词被很好地查找。@MartinSmith您是对的,我甚至没有意识到OP认为聚集索引没有帮助。。。因此,我重申:在做出假设之前,请检查查询计划!你不需要把它分割。您只需要添加一个非聚集索引。要查看是否正在使用索引/分区,请检查查询计划。如果主键具有前导列pku id
,则不需要额外的非聚集索引或任何分区(如图所示)上面的聚集索引将允许您的谓词被很好地查找。@MartinSmith您是对的,我甚至没有意识到OP认为聚集索引没有帮助。。。因此,我重申:在做出假设之前,请检查查询计划!