分区
PostgreSQL支持基本的表分区功能。
概述
分区的意思是把逻辑上的一个大表分割成物理上的几块。分区可以提供若干好处:
- 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少索引体积从而可以将高使用率部分的索引存放在内存中。如果索引不能全部放在内存中,那么在索引上的读和写都会产生更多的磁盘访问。
- 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是使用索引离散的访问整个表可以获得巨大的性能提升。
- 如果需要大量加载或者删除的记录位于单独的分区上,那么可以通过直接读取或删除那个分区以获得巨大的性能提升,因为ALTER TABLE比操作大量的数据要快的多。它同时还可以避免由于大量DELETE导致的VACUUM超载。
- 很少用的数据可以移动到便宜一些的慢速存储介质上。
这种好处通常只有在表可能会变得非常大的情况下才有价值。到底多大的表会从分区中收益取决于具体的应用, 不过有个基本的拇指规则就是表的大小超过了数据库服务器的物理内存大小。
目前,PostgreSQL支持通过表继承进行分区。每个分区必须做为单独一个父表的子表进行创建。父表自身通常是空的,它的存在只是为了代表整个数据集。你在试图实现分区之前,应该先熟悉继承
PostgreSQL可以实现下面形式的分区:
- 范围分区
表被一个或者多个关键字段分区成"范围",这些范围在不同的分区里没有重叠。比如,我们可以为特定的商业对象根据数据范围分区,或者根据标识符范围分区。
- 列表分区
表通过明确地列出每个分区里应该出现那些关键字值实现。
实现分区
要设置一个分区的表,做下面的步骤:
- 创建"主表",所有分区都从它继承。
- 这个表中没有数据,不要在这个表上定义任何检查约束,除非你希望约束同样也适用于所有分区。同样,在其上定义任何索引或者唯一约束也没有意义。
- 创建几个"子表",每个都从主表上继承。通常,这些表不会增加任何字段。
- 我们将把子表称作分区,尽管它们就是普通的PostgreSQL表。
- 给分区表增加约束,定义每个分区允许的健值。
--创建序列 create sequence id_seq increment by 1 minvalue 1 no maxvalue start with 1; --查询序列的值 select nextval('id_seq') ; select currval('id_seq') ; --创建日志表 CREATE TABLE ss_log ( id character varying(255) NOT NULL, createtime timestamp without time zone, data character varying(4000), model character varying(200), type character varying(100), url character varying(2000), userid character varying(100), CONSTRAINT ss_log_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE ss_log OWNER TO postgres; --查询日志表数据 select * from ss_log ; truncate table ss_log ; --插入日志信息 insert into ss_log(id,createtime,data,model,type,url,userid) values('adfadfaa3c0147044a42c70000',now() ,'data','model','1','http://','11adfda') ; --为ss_log创建触发器,分配需要插入到日志表中的数据 CREATE TRIGGER insert_ss_log_trigger BEFORE INSERT ON ss_log FOR EACH ROW EXECUTE PROCEDURE ss_log_insert_trigger(); CREATE OR REPLACE FUNCTION ss_log_insert_trigger() RETURNS TRIGGER AS $$ declare table_name varchar := null ; log_createtime varchar := null ; BEGIN log_createtime := to_char(NEW.createtime,'yyyyMMdd') ; select relname into table_name from pg_class where relname = 'ss_log_'||log_createtime ; if table_name is null then table_name := 'ss_log_'||log_createtime ; execute 'CREATE TABLE '||table_name||' ( CHECK ( createtime >= '''||log_createtime||'''::timestamp AND createtime < ('''||log_createtime||'''::timestamp + interval ''1d'') ) )INHERITS (ss_log)'; end if ; --将数据插入相应的表 execute 'INSERT INTO '|| table_name||'(id,createtime,data,model,type,url,userid) VALUES (''' ||NEW.id||''','''||NEW.createtime||''','''||NEW.data||''','''||NEW.model||''','''||NEW.type||''','''||NEW.url||''','''||NEW.userid||''')' ; --不向主表中查数据 RETURN NULL; END; $$ LANGUAGE plpgsql;
相关推荐
分区分区为ActiveRecord添加了帮助,以操纵(读取,创建,更新)ActiveRecord模型,该模型表示可能位于许多数据库表之一中的数据(由Models数据确定)。 它还具有支持创建和删除子表以及分区支持基础结构的功能。 ...
官方给出的指导意见是:当表的大小超过了数据库服务器的物理内存大小则应当使用分区表,接下来结合一个例子具体记录一下创建分区表的详细过程。 创建分区表 首先看一下需求,现在有一张日志表,现在需要按表中的操作...
从这里可以看出PostgreSQL表...通过作用于主表的触发器,把主表的修改重定向到适当的分区表等工作,分区的创建和管理都需要我们用语言来控制,增加了开发人员的工作量,PostgreSQL表分区的所有表结构和表分区及触发器
创建分区表 删除指定分区 分区维护:创建未来的分区 分区维护:删除/过期旧分区 在全新安装上设置 Zabbix PostgreSQL 分区 故障排除 zabbix 数据库用户没有合适的权限 导入历史记录表需要永远 使用 pgpartman 将 ...
pgslice Postgres分区就像馅饼一样容易。 对于新表和现有表都非常有效,停机时间为零,应用程序更改最少。 无需在数据库服务器上安装任何东西。... 这将创建一个名为<table>_intermediate的分区表。
产品特点分区特定的数据库操作的迁移方法查询分区数据,创建临时分区和获取分区元数据的模型方法局限性分区表在db/schema.rb表示不正确-请使用:sql模式格式未来的工作自动分区创建(通过cron或其他方式)安装将此行...
使用分区创建表 编写查询:插入数据,添加和删除分区,创建全局索引和局部索引,以获取数据并使用索引 要提交工作,您需要提供指向git存储库的链接,该链接包含: 自然语言书面查询 PostgreSQL内置了对以下类型...
安装运行以下命令进行安装: composer require umbrellio/laravel-pg-extensions特征使用排除约束使用CHECK约束使用分区操作前检查现有索引 扩展表创建例子: Schema :: create ( 'table' , function ( Blueprint $ ...
APICarto Zoneville 是一项允许从地址确定特定分区的服务。 支持的区域是 ZFU(来源 IGN)和优先地区(来源城市部)。 安装 应用安装 $ git clone $ cd apicarto-zoneville (Debian) # apt install postgresql-9.3 ...
它有五个分区。 发货和发票都有各自的消费群体。 因此,可以运行多个发货和开票实例。 每个实例将获得特定事件。 技术领域 Sprint Boot 春天卡夫卡 阿帕奇httpd 卡夫卡 动物园管理员 Postgres Docker Compose链接...
2.4.1 按要求创建分区 23 2.4.2 网络设置 26 2.4.3 时区选择 28 2.4.4 root账号配置 28 2.4.5 验证 29 2.4.6 使用 NIS 或 NIS+ 30 2.4.7 程序包选择 30 2.4.8 X Window 安装 32 2.4.9 程序包安装 34 2.4.10 Linux...