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

1、联合查询

  1. SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id
  2.  
  3. # 其中table1,table2还可以分别用SQL选择如
  4.  
  5. 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、索引

  1. # 查看pg库某表table1是否使用索引
  2.  
  3. SELECT * FROM pg_indexes WHERE tablename='table1'
  4.  
  5. # 对table1的某一列或者几列创建索引
  6.  
  7. CREATE INDEX table1_index ON table1(num1, num2) # table_index为建立的索引名称
  8.  
  9. # 删除索引
  10.  
  11. DROP INDEX table1_index

2.1 复合索引

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

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

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

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

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

3、try...except的使用

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

  即

  1. 连接OPEN
  2. try {
  3.  
  4. try {
  5.  
  6. 数据库操作A
  7.  
  8. } catch (Exception e) {
  9.  
  10. log.error("do something");
  11.  
  12. }
  13.  
  14. 数据库操作B //此次数据操作有可能出现上面的错误。
  15.  
  16. 事务提交commit
  17.  
  18. } catch (Exception ex) {
  19.  
  20. 事务回滚rollback
  21.  
  22. } finally {
  23.  
  24. 关闭连接。
  25.  
  26. }

  1. 连接OPEN
  2.  
  3. try {
  4.  
  5. 数据库操作A
  6.  
  7. 数据库操作B
  8.  
  9. 事务提交commit
  10.  
  11. } catch (Exception ex) {
  12.  
  13. 数据库操作C //此次数据操作有可能出现上面的错误。
  14.  
  15. 事务提交commit
  16.  
  17. } finally {
  18.  
  19. 关闭连接。
  20.  
  21. }

以上两种方式都会有问题

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

  1. try {
  2.  
  3. 数据库操作A
  4.  
  5. } catch (Exception e) {
  6.  
  7. 事务回滚或者提交;
  8.  
  9. log.error("do something");
  10.  
  11. }
  12.  
  13. 数据库操作B
  14.  
  15. -----------------------------------------------------
  16. } catch (Exception ex) {
  17.  
  18. 事务回滚或者提交;
  19.  
  20. 数据库操作C
  21.  
  22. 事务提交commit
  23.  
  24. } finally {
  25.  
  26. 关闭连接。
  27.  
  28. }

 4、数据库清理

4.1 日常清理(VACUUM;)

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

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

4.2 重建索引(REINDEX)

  1.   语法
  2.   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、数据库、表大小查找

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

6、批量插入

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

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

  1. 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. 不清楚可以查询一下。

`  假设建表如下:

  1. create table student(
  2. id serial PRIMARY KEY NOT NULL,
  3. name varchar(50)
  4. )

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

  1. select * from student_id_seq

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

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

  1. alter table student alter id type bigint

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

  1. alter sequence student_id_seq as bigint;
  2. alter table student alter id type bigint;

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

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

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

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

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

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

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

  1. create table example(
  2. date_id int not null,
  3. company_id bigint not null,
  4. staff_id bigint not null)
  5.  
  6. comment on column example.date_id is '日期';
  7. comment on column example.company_id is '公司id';
  8. 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. 201871010119-帖佼佼《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  2. Android(常用)主流UI开源库整理

    这几天刚做完一个项目..有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下.后来想了一下,既然要整理,就把网上常用的 AndroidUI界面的主流开源库 一起整理一下,方便查看. ...

  3. [译]C# 7系列,Part 9: ref structs ref结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...

  4. 比较typeof与instanceof

    相同点: JavaScript中typeof和instanceof常用来判断一个变量是否为空,或者是什么类型的. 不同点: typeof的定义和用法: 返回值是一个字符串,用来说明变量的数据类型. 细 ...

  5. NLP标注工具brat 配置文件说明

    快速搭建brat 通过docker: docker run --name=brat -d -p 38080:80 -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat ...

  6. django 用户与权限管理

    django中使用content_type表进行存储app与model的关系.在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_typ ...

  7. abp示例项目BookStore搭建部署

    之前部署过BookStore项目,但是换了新电脑也想好好学习下这个示例项目,于是在新电脑上重新拉了Git上的ABP项目代码,一编译生成BookStore项目就报错,可以参考 abp示例项目BookSt ...

  8. 8年开发老司机告诉你啥是java开发?如何学?学习什么内容?

    什么是Java? 我从Java的官网上抄下来下面这段话:97% 的企业桌面运行 Java美国有 89% 的桌面(或计算机)运行 Java全球有 900 万 Java 开发人员开发人员的头号选择排名第一 ...

  9. C# - VS2019 WinFrm应用程序调用WebService服务

    WinFrm应用程序调用WebService服务 关于WebService的创建.发布与部署等相关操作不再赘述,传送门如下:C# VS2019 WebService创建与发布,并部署到Windows ...

  10. Spring Boot 的静态资源处理

    做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静态资源呢?以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要 ...