参考链接:http://www.postgres.cn/docs/9.5/
##postgresql
ORDBMS:对象关系型数据库管理系统,关系其实就是表的意思,用表来体现关系;
1 PLSQL可以大大降低parse/exec 百分比
2 存储过程可以自动完成静态SQL variable bind
3 存储过程大大减少了JDBC网络传输与交互,速度快
4 oracle 中存储过程内部commit为异步写,一定程度上减少了等redo日志落地时间
5 存储过程最大问题就是给数据库开发工作压力太大,另外架构升级时候会比较难解耦
6 触发器不推荐使用,触发操作能在业务层解决就在业务层解决,否则很难维护,而且容易产生死锁
存储过程:可以使用,但不要滥用;
触发器:建议能不用就不用,触发器做为下下策之备选方案。
vacuum 只是将删除状态的空间释放掉,转换到能够重新使用的状态,但是它不进行空间合并。
vacuum full 将会使空间释放的信息表现在系统级别,其实质是将当前删除记录后面的数据进行移动,使得整体的记录连贯
起来,降低了“高水位标记”。因此它需要lock table。
vacuum analyze 更新统计信息,使得优化器能够选择更好的方案执行sql。
autovacuum 数据库定时自动进行vacuum
1、对于有大量update 的表,vacuum full是没有必要的,因为它的空间还会再次增长,所以vacuum就足够了。
2、oracle中同样也有analyze,作用也相同,目前更多的使用的是dbms_stats包。统计信息收集和更新对于系统性能来说非常重要。
oracle在进行imp后自动的对相应数据对象进行统计信息的收集和更新,而postgresql的恢复过程还没有集成到里面,需要手动去执行。
3、适当调大参数maintenance_work_mem,可加快vacuum的执行速度
vacuum t_sfa_sample; ---非常快速(10s内)就执行完了
修改pg参数,重载生效:
show all;
alter system set shared_buffers='256MB';
pg_ctl reload
直接修改生效:
set work_mem='16MB';
删除排序后的前10行:delete from storage_http where id in (select id from storage_http order by timestamp limit 10)
###用户管理
postgresql装好后,默认有个postgres用户,可以以psql -U postgres免密登录,登录后通过\du,可以查看数据库用户;\password postgres 为postgres创建密码
postgres既是系统用户也是postgres用户,其它通过createuser创建的用户是postgres用户,必须以postgres系统用户执行createuser来创建其它postgresql数据库用户
createuser的选项中,小写表示允许,大写表示不允许,createuser -s(super) -R(not create role) -d(create database) xxx(用户名)
createdb -U postgres -O uts(拥有者) uts(数据库名字)
createruser和createdb可以以postgres登录数据库后用数据库自带的命令来完成等价操作:
CREATE USER dbuser WITH PASSWORD 'password';CREATE DATABASE exampledb OWNER dbuser;
GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
登录数据库全命令参数:psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432
###基本命令
\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接其他数据库。
\d:列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
\e:打开文本编辑器。
\conninfo:列出当前数据库和连接的信息。
非特权用户带有>提示
SELECT version();
\?: 查看所有帮助
\l: 查看所有数据库
\c dataname: 切换数据库
\dt: 查看所有自己创建的表
\dt+: 查看所有自己创建的表,显示表的相关内容占的磁盘大小
\dt(+) tablename: 参看指定表
\dv: 查看所有自己创建的视图
\dv+: 查看所有自己创建的视图,显示大小
\df: 查看所有自己创建的function
\df+: 查看所有自己创建的function,显示function的内容
\df(+) func_name: 显示指定的function
\ef func_name: 编辑function
\dy:查看触发器
\dx: 查看添加的PostgreSQL扩展模块
\du: 查看所有角色
\dp viewortable: 查看表或视图的权限
\sf+ 函数名: 查看函数的创建语句
###基本操作
####建表
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- 最低温度
temp_hi int, -- 最高温度
prcp real, -- 湿度
date date
);
注意最后一个字段没有分号;--是注释;SQL 是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写;
varchar(n)/varying(n) character(n) text 对于char的使用,应该在确定字符串长度的情况下使用,否则应该选择varchar或者text;
这三种类型之间没有性能差别,除了当使用填充空白类型时的增加存储空间,和当存储长度约束的列时一些检查存入时长度的额外的CPU周期。虽然在某些其它的数据库系统里,
character(n) 有一定的性能优势,但在PostgreSQL里没有。事实上,character(n)通常是这三个中最慢的,因为额外存储成本。在大多数情况下,应该使用text 或character varying。
int是普通的整数类型。real是一种用于存储单精度浮点数的类型。date类型应该可以自解释。
int、smallint、real、double precision、char(N)、varchar(N)、date、time、timestamp和interval
####删表
DROP TABLE tablename;
####插入
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
不是简单数字值的常量通常必需用单引号(')包围
COPY weather FROM '/home/user/weather.csv' with csv; //copy命令批量导入数据
copy to的导出速度非常之快,经测试10W的数据量只需要3秒左右的时间 COPY user TO '/tmp/data/test.csv' WITH csv;
插入多行:
INSERT INTO products (product_no, name, price) VALUES
(1, 'Cheese', 9.99),
(2, 'Bread', 1.99),
(3, 'Milk', 2.99);
####查询
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
SELECT * FROM weather WHERE city = 'San Francisco' AND prcp > 0.0;
SELECT * FROM weather ORDER BY city,temp_hi;
SELECT DISTINCT city FROM weather;
同时访问同一个或者不同表的多个行的查询叫连接查询,在一个连接查询中限定所有列名是一种好的风格
SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name); 内连接
SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name); 左外连接 //RIGHT OUTER JOIN //FULL JOIN
左外连接:因为在连接操作符左部的表中的行在输出中至少要出现一次, 而在右部的表的行只有在能找到匹配的左部表行是才被输出。 如果输出的左部表的行没有对应匹配的右部表的行,那么右部表行的列将填充空值(null)。
左向外连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。
CROSS JOIN //笛卡尔积
SELECT * FROM weather w, cities c WHERE w.city = c.name; //查询时取别名,减少字符输入
别名成为当前查询的表引用的新名称 — 我们不再能够用该表最初的名字引用它了
聚集函数:count、sum、avg、max、min
SELECT city FROM weather WHERE temp_lo = max(temp_lo); 错误 //max不能被用于WHERE子句中,这个max在统计的时候范围并不是全部的temp_lo
使用子查询解决此问题:SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
聚集同样也常用于和GROUP BY子句组合。
SELECT city, max(temp_lo) FROM weather WHERE city LIKE 'S%'(1) GROUP BY city HAVING max(temp_lo) < 40;
WHERE和HAVING的基本区别如下:WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而HAVING在分组和聚集之后选取分组行。因此,
WHERE子句不能包含聚集函数;相反,HAVING子句总是包含聚集函数。
子查询指定了一个派生表,它必须被包围在圆括弧里并且必须被赋予一个表别名;
WHERE示例:
SELECT ... FROM fdt WHERE c1 > 5
SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)
SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)
SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)
SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100
SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)
如果一个表被分了组,那么没有在GROUP BY中列出的列都不能被引用,除非在聚集表达式中被引用。
OFFSET和LIMIT使用
####更新
UPDATE weather SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 WHERE date > '1994-11-28';
####删除
DELETE FROM weather WHERE city = 'Hayward';
####更改结构
ALTER TABLE user_tbl ADD email VARCHAR(40); 添加字段
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL; 更改字段属性
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup; 修改字段名
ALTER TABLE user_tbl DROP COLUMN email(cascade移除被引用列); 删除字段
ALTER TABLE user_tbl RENAME TO backup_tbl; 更改表名
DROP TABLE IF EXISTS backup_tbl; 删除表格
ALTER TABLE products ADD CHECK (name <> ''); 增加约束
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77; 更改默认值
####视图
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
视图允许用户通过始终如一的接口封装表的结构细节,这样可以避免表结构随着应用的进化而改变。
####外键
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
####事务
PostgreSQL实际上将每一个SQL语句都作为一个事务来执行。如果我们没有发出BEGIN命令,则每个独立的语句都会被加上一个隐式的BEGIN以及(如果成功)COMMIT来包围它。一组被BEGIN和COMMIT包围的语句也被称为一个事务块。
###数据类型
整型:数字类型由2、4或8字节的整数以及4或8字节的浮点数和可选精度小数组成;smallint integer bigint; real double precision numeric decimal
序列:smallserial、serial和bigserial类型不是真正的类型,它们只是为了创建唯一标识符列而存在的方便符号
货币:money
字符串:varchar(n)/character varying(n) character(n)/char(n) text
character(n)通常是这三种类型之中最慢的一个,因为它需要额外的存储开销以及较慢排序。在大多数情况下,应该使用text或者character varying。
二进制:bytea 1或4字节外加真正的二进制串 变长二进制串 SELECT E'\\xDEADBEEF';
日期:timestamp、date、time、interval select * from user_info where create_date >= '2015-07-01'
bool类型:TRUE FALSE
枚举:先创建枚举值,再插入
几何类型:point、cycle、line
网络地址类型:网络cidr、主机或网络inet、mac地址macaddr上
位串:bit(n),bit varying(n)上
文本搜索类型
uuid类型
xml类型
json类型:json数据类型存储输入文本的精准拷贝,处理函数必须在每 次执行时必须重新解析该数据。而jsonb数据被存储在一种分解好的 二进制格式中,
它在输入时要稍慢一些,因为需要做附加的转换。但是 jsonb在处理时要快很多,因为不需要解析。jsonb也支 持索引,这也是一个令人瞩目的优势。
通常,除非有特别特殊的需要(例如遗留的对象键顺序假设),大多数应用应该 更愿意把 JSON 数据存储为jsonb。
数组类型
组合类型
范围类型
对象标识符类型
pg_lsn类型:pg_lsn数据类型可以被用来存储 LSN(日志序列号)数据,LSN 是一个指向 XLOG 中的位置的指针。这个类型是XLogRecPtr的一种表达并且是 PostgreSQL的一种内部系统类型。
伪类型:any、void、cstring等,一个伪类型不能被用作一个列的数据类型,但是它可以被用来定义一个函数的参数或者结果类型。
###函数和操作符
AND OR NOT
> < = != BETWEEN IS NULL IS NOT NULL
算术运算符
数学函数、随机函数、三角函数、字符串函数、编码转换函数、format、二进制串函数、位串函数和操作符、模式匹配string LIKE pattern、类型转换函数、日期操作符和函数、
枚举支持函数、几何函数和操作符、网络地址函数和操作符、文本搜索函数和操作符、xml函数、json(b)函数和操作符、序列操作函数、条件表达式、数组函数和操作符、
范围函数和操作符、聚集函数(聚集函数从一个输入值的集合计算一个单一结果)、窗口函数、子查询表达式(EXISTS、IN、NOT IN、。。。)、行和数组比较、
集合返回函数、系统信息函数、系统管理函数、触发器函数、事件触发器函数
select function;直接调用函数返回结果
###索引
CREATE INDEX test1_id_index ON test1 (id);
DROP INDEX命令。索引可以随时被创建或删除。
需要定期地运行ANALYZE命令来更新统计信息以便查询规划器能做出正确的决定
PostgreSQL提供了多种索引类型: B-tree、Hash、GiST、SP-GiST、GIN 和 BRIN。 每一种索引类型使用了一种不同的算法来适应不同类型的查询。
默认情况下,CREATE INDEX 命令创建适合于大部分情况的B-tree 索引。
我们经常会做如下形式的查询:
SELECT name FROM test2 WHERE major = constant AND minor = constant;
那么我们可以在major和minor上定义一个索引:
CREATE INDEX test2_mm_idx ON test2 (major, minor);
表达式索引:CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1)); 建索引的思路就是在查询条件上建索引,如WHERE子句后
部分索引:排除不关心的内容
一个索引在每一个索引列上只能支持一种排序规则。检查一个独立查询的索引使用情况可以使用EXPLAIN命令。
###并发控制
PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问。在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护。
显式锁定
应用级别的完整性检查
使用MVCC并发控制模型而不是锁定的主要优点是在MVCC中,对查询(读)数据的锁请求与写数据的锁请求不冲突,所以读不会阻塞写,
而写也从不阻塞读。甚至在通过使用革新的可序列化快照隔离(SSI)级别提供最严格的事务隔离级别时,PostgreSQL也维持这个保证。(读写不冲突已保证)
###性能提示
EXPLAIN SELECT * FROM tenk1; 查询规划,分析每个查询动作postgres底层是如何做的,耗费的时间和性能,来为改进提供思路
EXPLAIN ANALYZE ;分析
规划器使用的统计信息:select relname,relkind,reltuples,relpages from pg_class where relname like 'city';
用显式JOIN子句控制规划器
禁用自动提交:在使用多个INSERT时,关闭自动提交并且只在最后做一次提交
使用COPY在一条命令中装载所有记录,而不是一系列INSERT命令。 COPY命令是为装载大量行而优化过的; 它没INSERT那么灵活,
但是在大量数据装载时导致的负荷也更少。 因为COPY是单条命令,因此使用这种方法填充表时无须关闭自动提交。
如果你不能使用COPY,那么使用PREPARE来创建一个预备INSERT语句也有所帮助,然后根据需要使用EXECUTE多次。这样就避免了重复分析和规划INSERT的负荷。
在载入大量行时,使用COPY几乎总是比使用INSERT快, 即使使用了PREPARE并且把多个插入被成批地放入一个单一事务。
如果你正在载入一个新创建的表,最快的方法是创建该表,用COPY批量载入该表的数据,然后创建表需要的任何索引。
在已存在数据的表上创建索引要比在每一行被载入时增量地更新它更快。
在载入大量数据时,临时增大maintenance_work_mem配置变量可以改进性能
临时增大max_wal_size配置变量也可以让大量数据载入更快
禁用 WAL 归档和流复制
非持久性设置:
将数据库集簇的数据目录放在一个内存支持的文件系统上(即RAM磁盘)。这消除了所有的数据库磁盘 I/O,但将数据存储限制到可用的内存量(可能有交换区)。
关闭fsync;不需要将数据刷入磁盘。
关闭synchronous_commit;可能不需要在每次提交时 强制把WAL写入磁盘。这种设置可能会在 数据库崩溃时带来事务丢失的风险(但是没有数据破坏)。
关闭full_page_writes;不许要警惕部分页面写入。
增加max_wal_size和checkpoint_timeout;这会降低检查点的频率,但会 增加/pg_xlog的存储要求。
创建不做日志的表 来避免WAL写入,不过这会让表在崩溃时不安全。
###环境准备
安装-创建用户-创建一个数据库集簇(一个数据库集簇是一个单一目录,所有数据都将被存储在其中)-pg_ctl将是你用来管理数据库服务器实例的唯一命令-
数据目录存在并且已经包含文件,initdb将拒绝运行。 这可以避免无意中覆盖一个已有的安装。
服务器启动排错:http://www.postgres.cn/docs/9.5/server-start.html
共享内存和信号量使用,内存使用(Out of Memory: Killed process 12345 (postgres).)
在PostgreSQL使用大量 连续内存块时利用大页面来降低开销
使用SSL进行安全连接
###服务器配置、认证、管理、本地化、维护
postgresql.conf postgresql.auto.conf中的设置会覆盖postgresql.conf 中的设置
PostgreSQL提供了三个SQL命令来建立配置默认值。 已经提到过的ALTER SYSTEM命令提供了一种改变全局默认值的从SQL可 访问的方法;
它在功效上等效于编辑postgresql.conf。此外,还有两个命令 可以针对每个数据库或者每个角色设置默认值:
ALTER DATABASE命令允许针对一个数据库覆盖其全局设置。
ALTER ROLE命令允许用用户指定的值来覆盖全局设置和数据库设置。
只有当开始一个新的数据库会话时,用ALTER DATABASE和 ALTER ROLE设置的值才会被应用。
一旦一个客户端连接到数据库,PostgreSQL会提供两个额外的SQL命令( 以及等效的函数)用以影响会话本地的配置设置:SHOW和SET
通过SHELL影响参数:在服务器启动期间,可以通过-c命令行参数把参数设置传递给 postgres命令;当通过libpq启动一个客户端会话时,可以使用PGOPTIONS 环境变量指定参数设置。
文件位置:
data_directory (string) 指定用于数据存储的目录。这个选项只能在服务器启动时设置。
config_file (string) 指定主服务器配置文件(通常叫postgresql.conf)。这个参数只能在postgres命令行上设置。
hba_file (string) 指定基于主机认证配置文件(通常叫pg_hba.conf)。 这个参数只能在服务器启动的时候设置。
ident_file (string) 指定用于第 19.2 节用户名称映射的配置文件(通常叫pg_ident.conf)。这个参数只能在服务器启动的时候设置。
external_pid_file (string) 指定可被服务器创建的用于管理程序的额外进程 ID(PID)文件。这个参数只能在服务器启动的时候设置。
日志文件配置:
PostgreSQL支持多种方法来记录服务器消息,包括stderr、csvlog和syslog。在 Windows 上还支持eventlog。设置这个参数为一个由想要的日志目的地的列表,之间用逗号分隔。默认值是只记录到stderr。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
默认日志存储在:/opt/nsfocus/data/hadoop/vdb/pg_log/pg_log/postgresql-Mon.log
运行时数据统计
自动清理
客户端连接默认值
锁管理
客户端认证:pg_hba.conf文件
数据库角色
PostgreSQL的VACUUM命令出于几个原因必须定期处理每一个表:
恢复或重用被已更新或已删除行所占用的磁盘空间。
更新被PostgreSQL查询规划器使用的数据统计信息。
更新可见性映射,它可以加速只用索引的扫描。
保护老旧数据不会由于事务ID回卷或多事务ID回卷而丢失。
正如后续小节中解释的,每一个原因都将指示以不同的频率和范围执行VACUUM操作。
有两种VACUUM的变体:标准VACUUM和VACUUM FULL。VACUUM FULL可以收回更多磁盘空间但是运行起来更慢。
另外,标准形式的VACUUM可以和生产数据库操作并行运行(SELECT、INSERT、UPDATE和DELETE等命令将继续正常工作,
但在清理期间你无法使用ALTER TABLE等命令来更新表的定义)。VACUUM FULL要求在其工作的表上得到一个排他锁,因此无法和对此表的其他使用并行。
因此,通常管理员应该努力使用标准VACUUM并且避免VACUUM FULL。
备份和恢复:转储
高可用、负载均衡、复制、恢复配置、统计收集器、查看锁、动态追踪DTrace
判断磁盘用量:每个表都有一个主要的堆磁盘文件,大多数数据都存储在其中。
可靠性和预写式日志:预写式日志(WAL)是保证数据完整性的一种标准方法。
异步提交是一个允许事务能更快完成的选项,代价是在数据库崩溃时最近的事务会丢失。在很多应用中这是一个可接受的交换。
WAL
回归测试
###词法结构
SELECT 'foo'
'bar';
会合并为SELECT ‘foobar’;
转义符:E’aa\b‘
常量:字符串常量、位串常量和数字常量
值表达式:列引用correlation.columnname、位置参数$number
函数编写与调用
创建表时指定默认值:
CREATE TABLE products (
product_no integer,
name text,
price numeric DEFAULT 9.99
);
约束 CHECK、NOT NULL、UNIQUE、PRIMARY KEY
一个表最多只能有一个主键(可以有任意数量的唯一和非空约束,它们可以达到和主键一样的功能,但只能有一个被标识为主键)。
一个外键约束指定一列(或一组列)中的值必须匹配出现在另一个表中某些行的值。我们说这维持了两个关联表之间的引用完整性。
如果缺少列的列表,则被引用表的主键将被用作被引用列
每一个表都拥有一些由系统隐式定义的系统列:oid、tableid、xmin、cmin、xmax、cmax、ctid。在PostgreSQL 8.1中,WITHOUT OIDS是默认形式。
GRANT UPDATE ON accounts TO joe; 增加权限 REVOKE ALL ON accounts FROM PUBLIC; 撤销权限
###其它概念
窗口函数:SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
继承:
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
行安全策略
模式schema
继承(ONLY排除表)
划分
外部数据
VI. 参考 SQL命令(可以用来查找命令使用方法)、PostgreSQL 客户端应用(客户端命令集,如psql、createuser等)、PostgreSQL 服务器应用(pg_ctl、initdb等)
VII. 内部
一个查询的路径:
一个由应用程序到PostgreSQL服务器的连接必须被建立。应用程序传递一个查询给服务器并等待接收由服务器传回的结果。
分析阶段对由应用程序传递的查询进行语法检查,并创建一个查询树。
重写系统得到分析阶段创建的查询树,并查找可以应用到该查询树的任何规则(存储在系统目录中)。对找到的规则,它会执行规则体中给定的转换。
重写系统的一个应用是实现视图。不论何时发生一个视图(即一个虚拟表)上的查询,重写系统将用户查询重写为一个访问视图定义中给定的基本表的查询来替代。
规划器/优化器接手(重写过的)查询树并创建一个将被作为执行器输入的查询计划。
它会先创建所有可能导向相同结果的路径。例如,如果在一个被扫描的关系上有一个索引,则有两条可供扫描的路径。其中之一是一个简单的顺序扫描,而另一个则是使用索引。接下来执行每条路径所需的代价被估算出来并且代价最低的路径将被选中。代价最低的路径将被扩展成一个完整的计划可供执行器使用。
执行器递归地逐步通过计划树并按照计划表述的方式获取行。执行器在扫描关系时会使用存储系统、执行排序和连接、估算条件并最后归还得到的行。
系统目录:
系统目录是关系型数据库存放模式元数据的地方,比如表和列的信息,以及内部统计信息等。PostgreSQL的系统目录就是普通表。你可以删除并重建这些表、增加列、插入和更新数值, 然后彻底把你的系统搞垮。 通常情况下,我们不应该手工修改系统目录,总有SQL命令可以做这些事情。
前/后端协议:
根据连接的状态不同,存在几种不同的子协议: 启动、查询、函数调用、COPY和终止。消息格式定义。
数据库物理存储:
在传统上,数据库集簇所使用的配置和数据文件都被一起存储在集簇的数据目录里, 通常用PGDATA来引用(用的是可以定义它的环境变量的名字)。
PGDATA的一个常见位置是 /var/lib/pgsql/data。PGDATA目录包含几个子目录以及一些控制文件,除了这些必要的东西之外,
集簇的配置文件postgresql.conf、pg_hba.conf和pg_ident.conf通常都存储在PGDATA中。
TOAST:超尺寸属性存储技术-The Oversized-Attribute Storage Technique。PostgreSQL使用固定的页面尺寸(通常是8kB), 并且不允许元组跨越多个页面。
因此不可能直接存储非常大的域值。 为了克服这个限制,大的域值会被压缩并/或分解成多个物理行。 这些处理对用户都是透明的,只是在大部分的后端代码
上有一些小的影响。 这个技术的昵称是TOAST(或者"从切片面包以来最好的事情")。
。。。。
VIII. 附录 错误代码、日期支持、关键词、符合性、版本说明、额外提供的模块、额外提供的程序、外部项目、源代码仓库、文档
###性能提升考虑
优化手段:事务、fsync off、buff大小(参数调整),copy插入 延后写
首先,测试磁盘的读写性能,磁盘的读写性能上限决定了数据库的读写性能
其它几个无作用的线程通过配置文件关掉(ps -ef|grep postgres)