切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
SQL Server
Redis
MySQL
其它
Oracle
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
数据库
SQL Server 中的分区功能($PARTITION 函数)
[TOC] ## 1. SQL Server 单库分区 ### 1.1. SQL Server 中的 `$PARTITION` 函数 `$PARTITION` 是 SQL Server 中用于**管理分区表**的系统函数,主要用于定位数据所在的分区,是“单库分表”场景下的关键工具(区别于分布式分库分表)。 #### 1.1.1. `$PARTITION` 的作用 - **定位分区**:判断某行数据属于分区表的哪个分区(返回分区编号)。 - **过滤分区**:查询时仅扫描指定分区(避免全表扫描,提升性能)。 - **分区管理**:统计每个分区的数据量,或删除指定分区的数据。 #### 1.1.2. 如何定义分区(依赖分区函数和分区方案) `$PARTITION` 的使用依赖于**分区函数**(定义分区规则)和**分区方案**(将分区映射到存储位置),步骤如下: ##### 1.1.2.1. 创建分区函数(定义分区规则) 分区函数用于定义“如何按分片键拆分数据”,以范围分片为例(按 `id` 分3个分区): ```sql -- 创建分区函数:按id范围将数据分为3个分区 CREATE PARTITION FUNCTION pf_user_id (BIGINT) AS RANGE LEFT FOR VALUES (1000000, 3000000); -- 规则: -- 分区1:id <= 1000000 -- 分区2:1000001 <= id <= 3000000 -- 分区3:id > 3000000 ``` - `RANGE LEFT` 表示“边界值属于左侧分区”(如 `1000000` 属于分区1)。 - `RANGE RIGHT` 则表示边界值属于右侧分区。 ##### 1.1.2.2. 创建分区方案(映射分区到文件组) 分区方案将分区函数定义的分区映射到物理存储的“文件组”(可理解为存储分区的文件夹): ```sql -- 1. 先创建3个文件组(可选,默认可使用PRIMARY) ALTER DATABASE MyDb ADD FILEGROUP fg_user1; ALTER DATABASE MyDb ADD FILEGROUP fg_user2; ALTER DATABASE MyDb ADD FILEGROUP fg_user3; -- 2. 创建分区方案,将分区映射到文件组 CREATE PARTITION SCHEME ps_user_id AS PARTITION pf_user_id -- 关联分区函数 TO (fg_user1, fg_user2, fg_user3); -- 分区1→fg_user1,分区2→fg_user2... ``` ##### 1.1.2.3. 创建分区表(使用分区方案) 基于分区方案创建表,指定分片键(`id`): ```sql -- 创建分区表:按id分区,使用ps_user_id方案 CREATE TABLE user_partitioned ( id BIGINT PRIMARY KEY, name NVARCHAR(50), create_time DATETIME ) ON ps_user_id (id); -- 按id字段分区 ``` #### 1.1.3. `$PARTITION` 的使用示例 ##### 1.1.3.1. 查询某行数据所在的分区 ```sql -- 查看id=1500000的行属于哪个分区 SELECT $PARTITION.pf_user_id(1500000) AS PartitionNumber; -- 结果:2(因为1500000在1000001-3000000之间,属于分区2) ``` ##### 1.1.3.2. 仅查询指定分区的数据(分页场景) ```sql -- 需求:查询分区2中的第2页数据(每页20条,按id升序) SELECT * FROM user_partitioned -- 仅扫描分区2(避免扫描其他分区) WHERE $PARTITION.pf_user_id(id) = 2 ORDER BY id ASC OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY; -- 第2页(21-40条) ``` ##### 1.1.3.3. 统计每个分区的数据量 ```sql -- 查看各分区的行数(用于监控分区均衡性) SELECT $PARTITION.pf_user_id(id) AS PartitionNumber, COUNT(*) AS RowCount FROM user_partitioned GROUP BY $PARTITION.pf_user_id(id) ORDER BY PartitionNumber; ``` ### 1.2. 分库分表 vs 分区表(`$PARTITION`) | 维度| 分布式分库分表(C# 路由)| SQL Server 分区表(`$PARTITION`)| |--|--|--| | 适用场景 | 超大规模数据(亿级+),需跨服务器扩展 | 千万级数据,单库内拆分,无需跨服务器 | | 定位方式 | C# 代码计算分片键,路由到目标库表 | `$PARTITION` 函数定位分区 | | 复杂度 | 高(需维护分库路由、分布式事务等) | 低(依赖SQL Server内置功能) | | 扩展性 | 可水平扩展到多服务器 | 受单服务器性能限制 | | 分页性能 | 跨分片分页需聚合结果,复杂但可优化 | 单库内分区分页高效,`$PARTITION` 过滤快 | ### 1.3. 总结 1. **分片实现(C#)**:核心是通过分片键(如 `user_id`)和预定义策略(哈希/范围),在代码中计算目标分库分表,避免全表扫描。适合分布式系统和超大规模数据。 2. **`$PARTITION` 函数**:是 SQL Server 分区表的工具,用于定位分区和过滤分区数据,适合单库内千万级数据的拆分,简化分页查询。 实际项目中,可根据数据量选择方案:千万级用 SQL Server 分区表(`$PARTITION`),亿级以上用分布式分库分表(C# 路由)。
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号