【编者按】作为一款开源的对象—关系数据库,Postgres 一直得到许多开发者喜爱。近日,Postgres 正式发布了9.5版本,该版本进行了大量的修复和功能改进。而本文将分享10个 Postgres 使用技巧,旨在让开发者能更加灵活和高效地使用这个数据库。

放假期间,很多人会选择去阅读一些新书或者学一些新技术来充实自己。下面笔者将推荐一些Postgres技巧和技能给大家,这些技巧会帮助你更加灵活方便地使用 Postgres。如果你觉得这些技巧会对你产生帮助,你可以选择订阅 Postgres weekly,本周都会发布一些Postgres最新的资讯和技术干货。

1.CTEs——Common Table Expressions

CTE 允许你做一些很棒的事情,比如递归查询,即使是用在一些最简单的语句操作上,CET 都会有很出色的表现。 CTE 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。这样开发者就可以更容易地创建可读查询。

开发者在创建 SQL 语句的时候,往往会有很多行,有的甚至超过上百行,而通过使用4-5个 CETs 后,语句会缩短很多,这样就很容易提高语句的可读性,尤其是对于新人来说。

2.安装一个.psqlrc

如果安装了 bashrc、vimrc 等文件,那为什么不对 Postgres 做些同样的操作呢?下面这些设置都非常棒,你不妨试试:

通过默认来获得更好的格式;

使用\pset null ¤,让 null 更形象化;

默认设置\timing on来显示 SQL 执行时间;

自定义提示\set PROMPT1'%[3[33;1m%]%x%[3[0m%]%[3[1m%]%/%[3[0m%]%R%# '

根据名称来保存你常用的运行语句。

下面是笔者的 psqlrc 设置:

\set QUIET 1
\pset null '¤' -- Customize prompts
\set PROMPT1 '%[3[1m%][%/] # '
\set PROMPT2 '... # ' -- Show how long each query takes to execute
\timing -- Use best available output format
\x auto
\set VERBOSITY verbose
\set HISTFILE ~/.psql_history- :DBNAME
\set HISTCONTROL ignoredups
\set COMP_KEYWORD_CASE upper
\unset QUIET

3. 通过 pg_stat_statements 来查看需要进行索引的地方

pg_stat_statements 可能是开发者提高数据库性能最有价值的工具。一旦启用(还有extension pg_stat_statements),它便会自动记录数据库的所有查询记录以及它们所花费的时间。这样,你就很容易优化查询语句,提高性能。

SELECT
(total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time,
query
FROM pg_stat_statements
ORDER BY 1 DESC
LIMIT 100;

当然,会因此付出一些性能代价,但对比其所带来的性能提升简直微乎其微。在这篇文章里可以读到更多关于 Postgres 性能方面的东西。

4. ETL 有点慢,用 FDWs

如果有大量的微服务或不同的应用程序,那么可能需要很多不同的数据库来支持它们。默认情况是创建一些数据仓库并通过 ETL 连接,但是这样做有时候太重度了。这时候,你只需要将数据库一次性集中在一起,或者在少数情况下,外部数据封装器可以允许你跨多个数据库查询,比如 Postgres 到Postgres,或者是 Postgres 到 Mongo 或 Redis 数据库之类。

5. array和array_agg

在开发应用程序时,很少会完全不用 arrays,而在数据库中同样如此。Arrays 可以看作是 Postgres 里的另一个数据类型,并拥有一些杀手级应用,比如博文标签这些。

但是,即使你不把 arrays 当做数据类型使用,也常常需要像一个 array 那样汇总一些数据,中间用逗号隔开。类似下面这样,你可以轻松汇总用户清单:

SELECT
users.email,
array_to_string(array_agg(projects.name), ',')) as projects
FROM
projects,
tasks,
users
WHERE projects.id = tasks.project_id
AND tasks.due_at > tasks.completed_at
AND tasks.due_at > now()
AND users.id = projects.user_id
GROUP BY
users.email

6.慎重使用 materialized views

你可能不熟悉 materialized views(物化视图),materialized views 是包括一个查询结果的数据库对像。所以,它是一些查询或「view」的一个物化的或基本的快照版本。在最开始的物化版本中,会在 Postgres 建立一个常请求,但整体是不可用的。那是因为当你锁定事务的时候,有可能会阻碍一些其它读取和活动。

现在已经好很多,但仍然缺乏一些开箱即用的工具来进行刷新。这也就意味着你必须安装一些调度任务或 cron 作业来定期刷新物化视图。如果你目前正在开发一些报告或者 BI 应用程序,那么你还是需要使用物化视图的。它们的可用性正在不断提升,所以,Postgres 已经知道如何自动化刷新它们。

7.窗口函数

窗口函数(Windows fuction)可能仍然是 SQL 中较复杂且很难理解的东西。总之,它们会让你排序一个查询结果,然后进行一行到玲一行的计算,如果没有 SQL PL,这些东西会很难做。不过,你可以做一些非常简单的操作,比如排名,基于某些值对结果进行排序;复杂些的,比如计算环比增长数据。

8.针对数据透视表的一个更简单方法

在 Postgres 中,Table_func 通常是作为计算一个数据透视表的引用方式。不幸地是,这个使用起来相当困难的,更为基础的用法是与原始 SQL 一起使用。在 Postgres 9.5 中已经进行了改进,用起来会方便很多。但在此之前,你汇总每个条件的结果不是 false 就是 true ,最后合计为更简单的推理:

select date,
sum(case when type = 'OSX' then val end) as osx,
sum(case when type = 'Windows' then val end) as windows,
sum(case when type = 'Linux' then val end) as linux
from daily_visits_per_os
group by date
order by date
limit 4;

大家可以前往Dimitri Fontaine博客查看具体示例。

9.PostGIS

PostGIS 可以说是所有 GIS 数据库中最好的一个了。事实上,开发者获得的所有 Postgres 标准会使它更加强大——一个最好的例子是来自 Postgres 近年来的 GiST 索引,它给 PostGIS 提供了极大的性能提升。 如果你现在正在做一些与地理空间数据有关的事情,并且需要一些比 earth_distance 扩展更好用的工具,那么 PostGIS 就是你最佳选择。

10.JSONB

从 Postgres 9.2 开始,Postgres 的每个版本中都有 JSON 的身影,在每个新版本功能都有所提升,并且正在逐步完善成一个更加完美的库。在最新发布的9.5版本中,JSONB在psql中的输出也更具可读性。

原文地址:http://www.craigkerstiens.com/2015/12/29/my-postgres-top-10-for-2016/

本文系国内 ITOM 行业领军企业OneAPM 工程师编译整理。我们致力于帮助企业用户提供全栈式的性能管理以及IT运维管理服务,通过一个探针就能够完成日志分析、安全防护、APM 基础组件监控、集成报警以及大数据分析等功能。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

最新文章

  1. [转]PHP的执行流程,PHP扩展加载过程
  2. 获得appstore里面app的最新的版本信息,进行版本更新
  3. Linux 下系统调用的三种方法
  4. C#遍历enum类型
  5. BootStrap栅格系统原理 笔记
  6. CSS对浏览器的兼容性(IE和Firefox)技巧整理
  7. attachEvent ,addEventListener
  8. PowerShell让系统可以执行.ps1文件
  9. set RowCount 与 top n
  10. asp.net 一般处理程序session 为 null
  11. React实例----一个表单验证比较复杂的页面
  12. Sublime text3 代码格式化插件
  13. 前端页面间传值之cookie传值和url传值
  14. (五)通过Python的select监控多个描述符实现并发连接
  15. nested exception is java.lang.ClassNotFoundException
  16. linux系统最小化安装后的初始化脚本
  17. Centos7 Tomcat9随机启动
  18. Oracle保留两位小数的函数
  19. Jack Straws(poj 1127) 两直线是否相交模板
  20. Servlet中forward和redirect的区别

热门文章

  1. MYSQL学习笔记3--mysql 2PC二阶段协义 与 日志闪回
  2. linux内存管理系列 +CFS 图解
  3. QT开发pjsip的VOIP,A8平台运行
  4. Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)
  5. mysql-distinct去重、mysql-group …
  6. bootstrap 笔记01
  7. android使用adb installapk出现can't find **.apk to install
  8. java中时间差计算
  9. SQL Prompt Snippet Manager 妙用
  10. object-C 手动内存管理(MRC)