GP数据库中的表

1. 创建表
1) 创建普通表:
CREATE  TABLE  table_name (
     column_1    integer PRIMARY KEY DEFAULT   nextval('sequence_name'),   
 --为表建立主键,并设置默认值为sequence自动生成;
     column_2    varchar(40) NOT NULL,
--非空限定(如果不限定的话,默认为NULL);
     column_3    varchar(40) NOT NULL CHECK (column_3 <> ''), 
--检查列约束;
     column_4    char(5) UNIQUE, 
--为column_4字段定义一个唯一约束;
 column_5    numeric(10,2), 
--在表示整型的同时,还可以控制精度;
 column_6    date CONSTRAINT constraint_name NOT NULL, 
--定义一个给定名字的非空约束;
 column_7    text, 
--text类型为存放文本文件之类的内容;
 column_8   timestamp DEFAULT current_timestamp, 
--为时间类型定义默认值;
CONSTRAINT constraint_name FOREIGN KEY(column_8) REFERENCES referenced_table_name(referenced_column_name),
--定义外键约束,当前表的外键,必须是主表的主键;
CONSTRAINT  constraint_name1 CHECK (column_1 > 100 AND column_2 <> ''), 
--检查表约束可以建在一个或多个字段上;
CONSTRAINT  constraint_name2 UNIQUE(column_1) 
--定义一个唯一表约束,唯一性约束可以建在一个或多个字段上;
) DISTRIBUTED BY (column_1) TABLESPACE  tablespace_name;   --为表指定表空间名


2) 创建分区表:
CREATE TABLE dw.tdw_12582_dn_dat_d
(
  statis_date numeric(8,0), -- 统计日期
  serv_num character varying(15), -- 手机卿
)
WITH (APPENDONLY=true, COMPRESSLEVEL=5, COMPRESSTYPE=zlib, OIDS=FALSE
)
DISTRIBUTED BY (serv_num)
     PARTITION BY LIST(statis_date) 
          (
          PARTITION pd_20150801 VALUES(20150801) WITH (appendonly=true, compresslevel=5, compresstype=zlib)  TABLESPACE dataspace, 
          PARTITION pd_20150802 VALUES(20150802) WITH (appendonly=true, compresslevel=5, compresstype=zlib)  TABLESPACE dataspace, 
      )


     PARTITION BY LIST(statis_month) 
     subpartition by list (statis_date)
     (
      partition pm_201508 values(201508)
        (
          subPARTITION pd_20150801 VALUES(20150801) WITH (appendonly=true, compresslevel=5, compresstype=zlib)  TABLESPACE dataspace, 
          subPARTITION pd_20150802 VALUES(20150802) WITH (appendonly=true, compresslevel=5, compresstype=zlib)  TABLESPACE dataspace,
           --------------------
        ) 
      )
;
ALTER TABLE dw.tdw_12582_dn_dat_d OWNER TO vgopsa;
COMMENT ON COLUMN dw.tdw_12582_dn_dat_d.statis_date IS '统计日期';
COMMENT ON COLUMN dw.tdw_12582_dn_dat_d.serv_num IS '手机卿';


2. 修改表结构
 
操作类型 执行语句   
列重命名 alter table table_name rename column old_column_name to new_column_name;   
表重命名 alter table table_name rename to new_table_name;   
添加新的列 alter table table_name add column column_name column_type
                        或
                         alter table table_name add column column_name column_type not null default 10;   
删除依赖于被依赖字段 alter table table_name drop column column_name restrict【默认方式】|cascade;   
修改字段数据类型 alter table table_name alter column column_name integer【或其它类型】;   
修改字段默认值 alter table table_name alter column column_name set default expression   
修改列名/修改列名并设置为非空限制/修改列名并删除非空限制 alter table table_name alter column column_name;

alter table table_name alter column column_name set not null;
或alter table table_name alter column column_name drop not null;   
删除字段默认值 alter table table_name alter column column_name drop default;   
设置字段存储模式 alter table table_name alter column column_name set storage { plain | external | extended | main } 【plain: 用于定长的数值,内联且不压缩的;
External: 用于外部保存,不压缩的数据;EXTENDED: 用于外部的压缩数据;MAIN:用于内联,可压缩的数据】   
添加主键约束 alter table table_name add constraint constraint_name primary key (key_column_name);   
删除约束 alter table table_name drop constraint constraint_name   
修改表所存放的表空间 alter table table_name set tablespace tablespace_name;   
修改表的拥有者(即:将表移到新的用户下) alter table table_name old_owner_name to new_owner_name;  


3. 创建及修改表空间
1) 创建表空间:
如在 /data/indexes 路径下创建一个表空间 tablespace_name,由用户 owner_name所拥有
CREATE TABLESPACE tablespace_name OWNER owner_name LOCATION '/data/indexes';
2) 修改表空间名称:
alter tablespace old_tablespace_name rename to new_tablespace_name;
3) 修改表空间拥有者:

alter tablespace tablespace_name old_owner_name to new_owner_name;



<think>我们正在处理关于Greenplum数据库空间、文件空间和对应关系查看方法的问题。根据提供的引用信息,我们可以总结如下:引用[1]展示了查看空间大小的方法,涉及`pg_tablespace`系统和`pg_tablespace_size`函数。引用[2]提到了使用`pg_relation_filepath`函数来获取对应的文件路径(在PostgreSQL9.0及以上版本)。引用[4]给出了一个Greenplum中从查找对应数据文件的SQL查询,涉及`pg_class`和`pg_namespace`。在Greenplum中,空间(tablespace)和文件空间(filespace)是两个相关但不同的概念:-文件空间(filespace)定义了一个存储位置,通常对应于文件系统上的一个目录,用于存储数据文件。-空间(tablespace)则是一个逻辑概念,它映射到一个文件空间,从而允许数据库对象(如、索引)存储到特定的文件空间中。因此,一个空间会关联到一个文件空间,而一个文件空间可以有多个空间(但通常一个空间只对应一个文件空间)。要查看空间和文件空间的对应关系,我们可以查询系统`pg_tablespace`和`pg_filespace`(注意:在较新的Greenplum版本中,文件空间的概念可能已被空间直接替代,或者有变化。但根据问题,我们假设使用的是有文件空间的版本)。###查看空间和文件空间的对应关系1.**查看所有空间及其对应的文件空间**:```sqlSELECTspcnameAStablespace_name,fspcnameASfilespace_nameFROMpg_tablespacetsJOINpg_filespacefsONts.spcfsoid=fs.oid;```2.**查看某个特定空间对应的文件空间**:将上述查询加上WHERE条件,例如:```sqlSELECTspcnameAStablespace_name,fspcnameASfilespace_nameFROMpg_tablespacetsJOINpg_filespacefsONts.spcfsoid=fs.oidWHEREspcname='your_tablespace_name';```###查看空间对应的物理路径在Greenplum中,文件空间对应的物理路径存储在系统`pg_filespace_entry`中。可以通过以下查询查看每个文件空间的详细存储位置(包括每个segment的路径):```sqlSELECTfspcnameASfilespace_name,fsedbidASdbid,fselocationASlocationFROMpg_filespace_entryJOINpg_filespacefsONfsefsoid=fs.oid;```###查看或索引所在的空间和文件空间要查看某个或索引所在的空间(从而知道其文件空间),可以查询`pg_class`和`pg_tablespace`:```sqlSELECTc.relnameASobject_name,t.spcnameAStablespace_name,f.fspcnameASfilespace_nameFROMpg_classcLEFTJOINpg_tablespacetONc.reltablespace=t.oidJOINpg_filespacefONt.spcfsoid=f.oidWHEREc.relname='your_table_name';```注意:如果没有指定空间,则它位于数据库的默认空间中。可以通过查询`pg_database`获取数据库的默认空间,然后再关联到文件空间。###查看对应的物理文件引用[2]和[4]提供了查看对应物理文件的方法:-使用`pg_relation_filepath`函数(在Greenplum中也可用):```sqlSELECTpg_relation_filepath('schema_name.table_name');```这将返回该在文件系统中的路径(相对于数据目录)。-或者使用引用[4]中的查询(需要知道名和模式名):```sqlSELECTb.nspname||'.'||a.relnameASfull_name,a.relfilenodeASfile_node,pg_relation_filepath(a.oid)ASfile_pathFROMpg_classa,pg_namespacebWHEREa.relnamespace=b.oidANDa.relname='your_table_name'ANDb.nspname='your_schema_name';```###注意事项-在Greenplum中,由于是分布式数据库,每个在master和每个segment上都有对应的文件。上述`pg_relation_filepath`函数在master节点上执行返回的是master节点上该的文件路径(通常只是一个空,因为数据在segment上)。要查看segment上的文件,需要在segment上执行该函数,或者通过系统`gp_segment_configuration`和`pg_filespace_entry`来获取所有segment的位置。###总结通过上述查询,我们可以获得空间与文件空间的对应关系,以及对应的物理文件路径。这些信息对于数据库管理、数据存储优化和故障排查都非常有用。§§相关问题§§1.如何查看Greenplum中每个segment的空间使用情况?2.Greenplum中如何创建新的空间并指定文件空间?3.在Greenplum中,如何将移动到另一个空间?4.Greenplum的文件空间和空间有什么关系?</think>### Greenplum 空间与文件空间对应关系查看方法 在 Greenplum 中,**空间(Tablespace)** 是逻辑存储单元,而**文件空间(Filespace)** 是物理存储位置。它们通过系统关联,以下是查看对应关系的方法: #### 1. 查看空间与文件空间映射关系 ```sql SELECT spcname AS tablespace_name, pg_get_userbyid(spcowner) AS owner, pg_tablespace_location(oid) AS location, fspcname AS filespace_name FROM pg_tablespace JOIN pg_filespace ON pg_tablespace.spcfsoid = pg_filespace.oid; ``` **说明**: - `spcname`:空间名称 - `fspcname`:关联的文件空间名称 - `location`:物理存储路径 - 通过 `spcfsoid` 字段关联系统 `pg_filespace`[^4] #### 2. 查看对应的物理文件路径 ```sql SELECT pg_relation_filepath('schema_name.table_name') AS file_path; ``` 或使用 OID 查询: ```sql SELECT pg_relation_filepath(oid) AS file_path FROM pg_class WHERE relname = 'your_table_name'; ``` **结果示例**: `base/16384/12345` 数据存储在 `$PGDATA/base/16384/12345`[^2] #### 3. 查看文件空间物理位置 ```sql SELECT fspcname AS filespace_name, fselocation AS physical_path FROM pg_filespace_entry JOIN pg_filespace ON pg_filespace.oid = fsefsoid; ``` #### 4. 查看所在的空间 ```sql SELECT relname AS table_name, spcname AS tablespace_name FROM pg_class c LEFT JOIN pg_tablespace t ON c.reltablespace = t.oid WHERE relname = 'your_table_name'; ``` ### 关键概念说明 1. **层级关系**: 文件空间 → 空间 → 数据库对象(/索引) *物理存储 → 逻辑分组 → 具体数据* 2. **默认配置**: - 系统默认空间:`pg_default` - 系统默认文件空间:`pg_system` - 新建未指定空间时,使用数据库默认空间 3. **文件存储规则**: - 每个对应独立的物理文件 - TOAST 大对象存储在关联的 `*_toast` 文件中[^2] - 分区每个分区有独立文件 > **注意**:在分布式环境中,每个 Segment 节点都会存储对应文件的副本,需在**所有节点**执行路径查询才能获取完整信息[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值