sql server查询分区表

Posted

技术标签:

【中文标题】sql server查询分区表【英文标题】:sql server query partitioned table 【发布时间】:2019-02-07 10:31:53 【问题描述】:

有没有办法使用分区键列而不是分区号来获取表分区的所有行?

select * from partitioned_table
where $partition.fpartfunction(key_column) = 1

据我所知,上面返回分区 1 中的所有行。我想知道我是否可以做类似的事情:

伪代码:

select * from partitioned_table
    where $partition.get_me_all_rows_in_partition_with_Keycolumn_year = '2019' 

【问题讨论】:

您想找到包含年份 2019 的分区,然后获取属于该分区的所有行(可能包括其他年份?) - 是的。如果是这样,您可以使用 DMV 计算出一个值会落入哪个分区 【参考方案1】:

要使用分区列而不是直接使用分区函数从分区中获取所有行,请指定匹配实际分区边界的WHERE 子句。 SQL Server 使用范围分区,因此您需要指定下边界值(第一个分区除外)和上边界值(最后一个分区除外)。

下边界谓词需要为>RANGE LEFT 分区函数,因为分区边界不包括边界值。相反,下边界谓词需要为>=,并带有RANGE RIGHT 分区函数,因为分区边界不包括边界值。

以下是date 数据类型分区列上的年度分区示例。

CREATE PARTITION FUNCTION PF_Date(date) AS RANGE LEFT FOR VALUES('2019-01-01','2020-01-01');

--first partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column <= '2019-01-01';
--second partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column > '2019-01-01' AND key_column <= '2020-01-01';
--last partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column > '2020-01-01';

CREATE PARTITION FUNCTION PF_Date(date) AS RANGE RIGHT FOR VALUES('2019-01-01','2020-01-01');

--first partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column < '2019-01-01';
--second partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column >= '2019-01-01' AND key_column < '2020-01-01';
--last partition
SELECT *
FROM dbo.partitioned_table
WHERE key_column >= '2020-01-01';

【讨论】:

以上是关于sql server查询分区表的主要内容,如果未能解决你的问题,请参考以下文章

转载:SQL Server 2008-建立分区表(Table Partition) 转载

SQL SERVER分区具体例子详解

SQL Server 使用分区函数实现查询优化

Sql Server系列:分区表操作

SQL Server 2008 分区函数和分区表

深入浅出SQL Server 2008 分区函数和分区表