SHOW CREATE TABLE
或 INFORMATION_SCHEMA.PARTITIONS
,SQL Server 的 sys.partitions
,Oracle 的 USER_TAB_PARTITIONS
)查看表的分区定义及信息,不同 DBMS 语法不同。在数据库管理中,表分区是一种将大表物理拆分为更小、更易管理的片段(分区)的技术,常用于提升查询性能、简化数据维护(如快速删除旧数据),不同数据库系统查看分区的方式各有差异,以下是主流数据库的详细操作方法:
MySQL / MariaDB
方法1:使用 SHOW CREATE TABLE
语句
SHOW CREATE TABLE your_table_name;
- 输出结果:在返回的建表语句中,查找
PARTITION BY
子句(如PARTITION BY RANGE
、PARTITION BY LIST
等),会明确显示分区策略、分区键及每个分区的定义。 - 优点:直观展示完整分区结构。
方法2:查询 information_schema.PARTITIONS
表
SELECT PARTITION_NAME, PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'your_table_name';
- 关键字段说明:
PARTITION_NAME
:分区名称PARTITION_METHOD
:分区类型(RANGE, LIST, HASH, KEY)PARTITION_EXPRESSION
:分区依据的列或表达式PARTITION_DESCRIPTION
:分区边界值(如RANGE分区的MAXVALUE)TABLE_ROWS
:分区内数据行数(估算值)
注意事项:
- 若表未分区,查询结果为空。
- 子分区信息可通过
SUBPARTITION_*
字段查看。
Oracle Database
核心数据字典视图
-
查看分区定义:
SELECT table_name, partitioning_type, partition_count FROM dba_part_tables WHERE table_name = 'YOUR_TABLE_NAME';
-
查看所有分区详情:
SELECT partition_name, high_value, -- 分区边界值(需用DBMS_LOB.SUBSTR转换) num_rows, tablespace_name FROM dba_tab_partitions WHERE table_name = 'YOUR_TABLE_NAME';
-
查看分区键列:
SELECT column_name, column_position FROM dba_part_key_columns WHERE name = 'YOUR_TABLE_NAME';
关键操作:
- 使用
DBMS_METADATA.GET_DDL
获取完整分区DDL:SET LONG 1000000; SELECT DBMS_METADATA.GET_DDL('TABLE', 'YOUR_TABLE_NAME') FROM dual;
Microsoft SQL Server
步骤1:确认表是否分区
SELECT t.name AS TableName, p.partition_number, fg.name AS FileGroup FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id JOIN sys.allocation_units au ON p.partition_id = au.container_id JOIN sys.filegroups fg ON au.data_space_id = fg.data_space_id WHERE t.name = 'YourTableName' AND i.index_id IN (0,1); -- 堆表或聚集索引
步骤2:查看分区方案与函数
-- 查看分区函数(定义边界值) SELECT * FROM sys.partition_functions; -- 查看分区方案(映射文件组) SELECT * FROM sys.partition_schemes;
步骤3:查看分区数据分布
SELECT partition_number, rows AS 'Rows', value AS 'BoundaryValue' FROM sys.partitions p JOIN sys.partition_range_values rv ON p.partition_number = rv.boundary_id WHERE OBJECT_NAME(p.object_id) = 'YourTableName';
PostgreSQL
方法1:查询系统目录表(声明式分区)
-- 查看父表分区策略 SELECT partstrat, partdefid FROM pg_partitioned_table WHERE partrelid = 'your_schema.your_table'::regclass; -- 查看所有子分区 SELECT relname AS child_table FROM pg_inherits WHERE inhparent = 'your_schema.your_table'::regclass;
方法2:使用 pg_catalog.pg_partitions
视图(需安装扩展)
SELECT partitionname, partitionboundary FROM pg_catalog.pg_partitions WHERE tablename = 'your_table';
传统继承式分区:
通过查询 pg_inherits
系统表获取所有子表。
通用总结与最佳实践
- 核心原理:所有数据库都通过系统表/视图存储分区元数据。
- 关键信息:重点关注分区类型(Range/List/Hash)、分区键、边界值、数据分布。
- 工具辅助:
- MySQL Workbench / Oracle SQL Developer / SSMS / pgAdmin 等GUI工具通常提供可视化分区查看。
- 命令行工具(如
mysql
,sqlplus
,psql
)适合脚本化操作。
- 性能影响:查询系统表通常轻量,但在生产环境谨慎操作。
引用说明 基于主流数据库官方文档整理:
- MySQL 8.0 Reference Manual: Partitioning
- Oracle 19c Database Administrator’s Guide: Partitioned Tables and Indexes
- Microsoft Docs: Partitioned Tables and Indexes
- PostgreSQL 15 Documentation: Table Partitioning
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/39439.html