pgsql 怎么查询出所有非分区表
时间: 2024-05-09 16:20:13 浏览: 269
可以使用以下 SQL 查询语句来查询所有非分区表:
```
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_type = 'BASE TABLE'
AND NOT EXISTS (
SELECT 1
FROM pg_partitioned_table
WHERE pg_partitioned_table.relid = (
SELECT oid
FROM pg_class
WHERE relname = table_name
)
);
```
该语句使用 `information_schema.tables` 和 `pg_partitioned_table` 进行联合查询。其中,`information_schema.tables` 表用于获取关于所有表的信息,`pg_partitioned_table` 表用于获取关于所有分区表的信息。
该查询语句首先选择 `public` 模式下的所有基本表(即非分区表),然后检查每个表是否在 `pg_partitioned_table` 中有对应的条目。如果没有,则说明该表不是分区表。最后,该语句返回所有非分区表的名称。
相关问题
pgsql分区表查询
### 如何在 PostgreSQL 中进行分区表查询
对于已创建好的分区表,在执行查询操作时,通常不需要特别指定要访问哪个子分片;PostgreSQL 的查询规划器会自动识别并仅扫描相关的分区[^1]。
#### 查询特定分区的数据
如果希望强制查询某个具体的分区而不是让数据库自行决定,则可以在 `FROM` 子句中直接指明该分区的名字:
```sql
SELECT * FROM measurement_y2018m07;
```
这里的 `measurement_y2018m07` 是假设的一个具体月份的分区名称。这种方式适用于知道确切分区名的情况下的高效读取场景[^3]。
#### 使用通用方式查询整个父表
当不知道具体分区名字或者想要获取所有分区内的数据汇总时,可以通过查询定义分区结构的那个顶级(父)表来达到目的:
```sql
SELECT * FROM measurements WHERE logdate >= DATE '2018-07-01' AND logdate < DATE '2018-08-01';
```
在这个例子中,即使 `measurements` 表被划分为多个不同的时间区间对应的物理存储单元(即各个实际存在的分区),上述命令仍然能够正常工作,并且只会触发对应时间段内有关联性的那些分区上的 I/O 操作[^4]。
#### 利用EXPLAIN ANALYZE查看查询计划
为了更好地了解查询过程中涉及到了哪些分区以及它们是如何被执行的,可以利用 `EXPLAIN ANALYZE` 来观察实际发生的动作:
```sql
EXPLAIN (ANALYZE, VERBOSE) SELECT * FROM measurements WHERE logdate BETWEEN '2018-07-01' AND '2018-07-31';
```
这条语句不仅返回了预期的结果集,还会给出详细的执行统计信息,帮助评估性能表现和诊断潜在的问题所在。
pgsql普通表转分区表
将 PostgreSQL 中的普通表转换为分区表,需要以下步骤:
1. 创建分区表:首先需要创建一个与原来普通表结构相同的分区表,可以使用以下命令:
```sql
CREATE TABLE my_partitioned_table (
like my_table INCLUDING ALL
) PARTITION BY RANGE (column_to_partition);
```
此命令将创建一个名为 my_partitioned_table 的分区表,其结构与 my_table 相同,并且将根据 column_to_partition 列的值进行分区。
2. 创建分区:使用以下命令为分区表创建分区:
```sql
CREATE TABLE my_partition_1 PARTITION OF my_partitioned_table FOR VALUES FROM (min_value) TO (max_value);
```
此命令将创建一个名为 my_partition_1 的分区,其包含所有 column_to_partition 列值在 min_value 和 max_value 之间的行。可以根据需要创建多个分区。
3. 将数据从原表中导入分区表:使用以下命令将数据从 my_table 中导入到 my_partitioned_table 中:
```sql
INSERT INTO my_partitioned_table SELECT * FROM my_table;
```
此命令将从 my_table 中选择所有行,并将它们插入到 my_partitioned_table 中。由于 my_partitioned_table 是一个分区表,将在正确的分区中自动插入这些行。
4. 删除原表:最后,使用以下命令删除原来的普通表:
```sql
DROP TABLE my_table;
```
这样就完成了将 PostgreSQL 中的普通表转换为分区表的过程。注意:在转换过程中,需要对数据进行备份以确保不会丢失数据。
阅读全文
相关推荐














