PostgreSQL自带Pgadmin客户端,可用于访问本地和远程PG库,一些tricks如下:

1、联合查询

SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id

# 其中table1,table2还可以分别用SQL选择如

SELECT * FROM (SELECT * FROM table1 where num1=2 limit 10 offset 0) a INNER JOIN (SELECT * FROM  table2 where num2=4) b ON a.id=b.id

2、索引

# 查看pg库某表table1是否使用索引

SELECT * FROM pg_indexes WHERE tablename='table1'

# 对table1的某一列或者几列创建索引

CREATE INDEX table1_index ON table1(num1, num2)  # table_index为建立的索引名称

# 删除索引

DROP INDEX table1_index

2.1 复合索引

多列复合索引的创建建议:

  1、离散查询条件(例如 等值)的列放在最前面,如果一个复合查询中有多个等值查询的列,尽量将选择性好(count(distinct) 值多的)的放在前面。

  2、离散查询条件(例如 多值)的列放在后面,如果一个复合查询中有多个多值查询的列,尽量将选择性好(count(distinct) 值多的)的放在前面。

  3、连续查询条件(例如 范围查询)的列放在最后面,如果一个复合查询中有多个多值查询的列,尽量将输入范围条件返回结果集少的列放前面,提高筛选效率(同时也减少索引扫描的范围)。

  4、如果返回的结果集非常大(或者说条件命中率很高),并且属于流式返回(或需要高效率优先返回前面几条记录),同时有排序输出的需求。建议按排序键建立索引。

3、try...except的使用

  Postgres数据库中,同一事务中如果某次数据库操作中出错的话,那这个事务以后的数据库都会出错。

  即

连接OPEN。
try { try { 数据库操作A。 } catch (Exception e) { log.error("do something"); } 数据库操作B。 //此次数据操作有可能出现上面的错误。 事务提交commit。 } catch (Exception ex) { 事务回滚rollback。 } finally { 关闭连接。 }

连接OPEN。

          try {

               数据库操作A。

               数据库操作B。

               事务提交commit。

           } catch (Exception ex) {

               数据库操作C。   //此次数据操作有可能出现上面的错误。

               事务提交commit。

           } finally {

               关闭连接。

           }

以上两种方式都会有问题

我们可以在某个操作出错后加入事务提交或者回滚

  try {

                数据库操作A。

          } catch (Exception e) {

               事务回滚或者提交;

               log.error("do something");

          }

          数据库操作B。 

-----------------------------------------------------
} catch (Exception ex) { 事务回滚或者提交; 数据库操作C。 事务提交commit。 } finally { 关闭连接。 }

 4、数据库清理

4.1 日常清理(VACUUM;)

日常清理(VACUUM;),因为有大量的更新(update)"删除(delete)操作,会有大量的空间需要释放。
每日执行一次VACUUM,每周访问量低的时候执行VACUUM FULL;

语法结构;

VACUUM [ FULL | FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ] FULL ------选择"完全"清理,这样可以恢复更多的空间, 但是花的时间更多并且在表上施加了排它锁。
FREEZE ---------选择激进的元组"冻结"。
VERBOSE --------- 为每个表打印一份详细的清理工作报告。
ANALYZE --------- 更新用于优化器的统计信息,以决定执行查询的最有效方法。
table ------- 要清理的表的名称(可以有模式修饰)。缺省时是当前数据库中的所有表。
column ---------要分析的具体的列/字段名称。缺省是所有列/字段。

4.2 重建索引(REINDEX)

  语法
  REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]

描述

REINDEX命令用来重建索引。旧的索引将被删除,重新读取索引的父表中的数据来重建索引。REINDEX命令不支持并发创建索引的功能。在下面的情况下,应该重建索引:
  (1)一个索引中的数据已被破坏,包含非法的数据。软件错误和硬件问题都会导致索引被损坏。
  (2)索引中包含许多空的或者几乎是空的数据页。应该重建索引,回收物理存储空间。
  (3)该变了索引的存储参数fillfactor的值,只有重建索引,新的参数值才能完全生效。
  (4)使用CREATE INDEX CONCURRENTLY命令创建索引时遇到错误,留下一个非法的索引。

 例子
  (1)重建索引my_index:REINDEX INDEX my_index;
  (2)重建表my_table 上的所有索引:REINDEX TABLE my_table;
  (3)重建数据库中的所有索引:REINDEX DATABASE broken_db;

5、数据库、表大小查找

#  表空间查找
select pg_table_size('tablename')
# 以kb、M、G等单位显示
select pg_size_pretty(pg_table_size('tablename'))
# 数据库查找
select pg_database_size('database_name')
# 查找所有数据库大小
select pg_database.datname, pg_database_size(pg_database.datname) as size from pg_database

6、批量插入

当数据量比较大时,比如过亿的数据量要插入到数据库中,有几个策略可以提升速度:

  (1)创建unlogged的表,相当于内存表。

create unlogged table   

    unlogged table 的几个特点:

      1、unlogged table不记录wal日志,写入速度快,备库无数据,只有结构。

      2、当数据库crash后,数据库重启时自动清空unlogged table的数据。

      3、正常关闭数据库,再启动时,unlogged table有数据。

      4、unlogged table通常用于中间结果,频繁变更的会话数据

  (2)多次insert后)再commit

      比如设置500次insert后再进行一次commit

  (3)开启多线程或者多进程

 7、数据表字段改变数据类型

  最近公司存数据遇到一个问题,给id 设为serial自增,后来发现不够用了,达到了2147483647顶峰值。当初没有考虑到这个问题,应该最初建表的时候设为bigserial就足够了,看看官网给的数据类型:

  

Name Storage Size Description Range
smallint 2 bytes small-range integer -32768 to +32767
integer 4 bytes typical choice for integer -2147483648 to +2147483647
bigint 8 bytes large-range integer -9223372036854775808 to 9223372036854775807
decimal variable user-specified precision, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
numeric variable user-specified precision, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
real 4 bytes variable-precision, inexact 6 decimal digits precision
double precision 8 bytes variable-precision, inexact 15 decimal digits precision
serial 4 bytes autoincrementing integer 1 to 2147483647
bigserial 8 bytes large autoincrementing integer 1 to 9223372036854775807

  因为给id设为主键,让它自增,其实建表时serial相当于将id设为int类型,然后会新建一个sequence,对于postgresql9.6以及更早的版本,这个sequence会以bigint建表,10.0以后的版本,sequence也是int类型,即自增数据列表为1-2147483647. 不清楚可以查询一下。

`  假设建表如下:

create table student(
id serial PRIMARY KEY NOT NULL,
name varchar(50)
)

则同时会给建一个名为student_id_seq的序列表,还可以查看数据类型

select * from student_id_seq

结果中会显示sequence的数据类型,确定是int还是bigint。

如果版本在9.6以前,只需要更改id的数据类型为bigint即可

alter table student alter id type bigint

如果版本在10.0以后,sequence数据类型也需要更改

alter sequence student_id_seq as bigint;
alter table student alter id type bigint;

这样在查看数据类型,id就变味bigserial了

8、主键自增序列初始值设定

pg数据库当设定主键自增时,不管是serial还是bigserial,默认都是从1开始计数的。可是如果要指定从某个数开始计数该怎么办呢。比如从10000开始

实现起来也很简单,假设建好一张表tablename为student,主键为number_id, 要求默认从10000开始计数。则可以用以下命令实现

# SQL命令为
select setval('tablename_pkname_seq',10000,false);
# 我们这里即为
select setval('student_number_id_seq',10000,false);

9、创建数据库表时给字段添加注释

  不像mysql可以直接在创建表定义字段时直接加注释,pg数据库则是在创建后用 comment on column 命令注释。

create table example(
date_id int not null,
company_id bigint not null,
staff_id bigint not null) comment on column example.date_id is '日期';
comment on column example.company_id is '公司id';
comment on column example.staff_id is '员工id';

PostgreSQL数据库一些tricks的更多相关文章

  1. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  2. PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

    最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQ ...

  3. TPC-H生成.tbl文件导入postgresql数据库的坑

    数据库project好好的不用主流的MySQL和Microsoft server而要求用听都没听过的postgresql (当然,可能你三个都没听过) 这里的坑主要是把生成的那八张.tbl的表导入pg ...

  4. PowerDesigner反向工程PostgreSQL数据库

    1. 环境准备: a)         安装PowerDesigner,以PowerDesigner15.1为例 b)         安装java jdk,以jdk-7-windows-i586为例 ...

  5. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  6. Enterprise Architect的共享Respository设置,postgresql数据库

    Enterprise Architect有一个很实用的共享,在设计UML图的时候,可以连接到一个数据库服务器,将所有的画图数据共享在上面,所有连到这个server的人,都可以看到 别人的图,图中的元素 ...

  7. PostgreSQL数据库基本配置

    一.安装 首先安装PostgreSQL客户端: sudo apt-get install postgresql-client 然后,安装PostgreSQL服务器: sudo apt-get inst ...

  8. C#访问PostGreSQL数据库的方法 http://www.jb51.net/article/35643.htm

    这次的项目中的一个环节要求我把PostGreSQL数据取出来,然后放到SqlServer里,再去处理分析. http://www.jb51.net/article/35643.htm - 我对Post ...

  9. C#访问postgresql数据库

    最近开始做C#的DotNet的工作,因为对PostgreSQL数据库比较有兴趣,所以自己研究了一下如何访问PostgreSQL的 数据库的问题. 1.为了访问PostgreSQL数据库,需要从pgfo ...

随机推荐

  1. Scala函数式编程(四)函数式的数据结构 下

    前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...

  2. RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧

    目录 1.阅读源码之前的思考 2.从 Broker 启动流程看 DLedger 2.1 构建 DefaultMessageStore 2.2 增加节点状态变更事件监听器 2.3 调用 DefaultM ...

  3. Unity各平台宏定义

    属性 方法 UNITY_EDITOR #define directive for calling Unity Editor scripts from your game code. UNITY_EDI ...

  4. matplotlib可视化最全指南

    1. 折线图:plt.plot 设置数据:plt.plot(x,y),单列数据传入默认y轴,此时x轴数据默认从0逐渐对应递增 设置颜色:plt.plot(x,y,color/c=" &quo ...

  5. 重构 JAVA 聊天室 —— CS 模式的简单架构实现

    前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...

  6. python错误处理—try…catch…finally、调用栈分析

    高级语言包括python一般都内置了一套try…catch…finally的错误处理机制: >>> try: ... print('try...') ... r = 10 / 0 . ...

  7. SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. puppet5.1 安装与配置

    一.Puppet概念 简介 当服务器数量达到一定的规模时,仅依靠人为完成批量部署服务器个资源的配置,运维工作将变得繁琐且容易出错,为了解决这一问题,我们应该怎么办呢?我们可以引入一批工具,这批工具可编 ...

  9. Java面试题_第三阶段(Spring、MVC、IOC、AOP、DI、MyBatis、SSM、struts2)

    1.1 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗? 答:1)用于创建bean对象,管理bean对象的那个容器. 2)Spring IOC 容器 ...

  10. 【30天自制操作系统】day03:读写磁盘

    软盘 80个柱面,2个磁头,18个扇区 每个扇区 512 字节,共 1440 KB 读磁盘汇编 读取 10 个柱面到 0x0820 内存位置 ;读取磁盘 MOV AX,0x0820 MOV ES,AX ...