\dt+ 表名:查看表大小
\di+ 索引名:查看索引大小
\sf 函数名:查看函数定义
psql导入与导出
COPY命令是SQL命令,\copy是元命令
COPY命令必须具有SUPERUSER超级权限(将数据通过stdin、stdout方式导出导入情况除外),而\copy是元命令不需要SUPERUSER权限
COPY命令读取或写入数据库服务器端主机上的文件,而\copy是元命令是从psql客户端主机读取或写入文件
从性能来看,大数据量导出到文件或大文件数据导入数据库,COPY比\copy性能高
COPY test FROM '/home/…/test.txt'
COPY test To '/home/…/test.txt'
\set name value 设置变量名,name表示变量名称,value表示变量值
\set v_id=2
select *from test where id=:v_id
.psqlrc文件能够方便地预先制定维护脚本
postgresql支持最大的字段大小为1GB
EXTRACT函数可以从日期、时间数据类型中抽取年月日时分秒信息
select EXTRACT(year FROM now())
array_append:向数组末端追加一个元素
如:select array_append(array[1,2,3],4) ,array_remove(array[1,2,3,4],2)
json 和jsonb两种类型在使用上几乎完全相同,主要区别为:json存储格式为文本,而jsonb存储格式为二进制,由于存储格式的不同使得两种json数据类型的处理效率不一样,json类型以文本存储并且存储的内容和输入数据一样,当检索json数据时必须重新解析,而jsonb以二进制形式存储已解析好的数据,当检索jsonb数据时不需要重新解析,因此json写入比jsonb快,但检索比jsonb慢。
删除json数据的健/值:select '{“a”:1,”b”:2}::jsonb-a
1) 要注意使用 LeftJoin(Right Join 类似 ) 的场景。
避免大表 Hash。此场景会导致执行计划将右边的大表 Hash 到内存中,有时是性能拖累。应该将 SQL 改写为如下形式:
原 SQL:selects.*,b.xxx from small s left join big b on s.id=b.id
修改: select s.*,b.xxx from small s left join(select b.* from big b where b.id in(select idfrom small)) b on s.id=b.id 你会发现性能有很大提升。
2) 尽量不要写出自己理解起来都有困难的 SQL。比如:select ta a left join tb b on a.id=b.id where b.timeflag=’20140825’;你会发现执行计划中没有 left join,因为这个 where 条件导致 left join 直接被执行计划降级为 inner join 了。
一般来说 inner join 后面的 where 条件可以被提前到 table scan 节点,而 left join 的 where条件是对结果的 filter,结果中要求 b 表字段符合 not null 的条件,自然也就没有 left join 的逻辑了。
with查询是postgresql支持的高级sql特性之一,这一特性称为CTE
WITH t as (select generate_series(1,3)
select*from t
这个简单的CTE实例中,一开始定义了一条辅助语句t取数,之后在主查询语句中查询t,定义的辅助语句就像定义了一张临时表,对于复杂查询如果不使用CTE,可以通过创建视图方式简化SQL
网友评论