2016 年开发者应该掌握的十个 Postgres 技巧
【编者按】作为一款开源的对象—关系数据库,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 官方博客
2016 年开发者应该掌握的十个 Postgres 技巧的更多相关文章
- 2016 JetBrains 开发者日遇见开发神器的创造者
JetBrains团队首次落地中国北京!2016 JetBrains开发者日将于2016年11月26日星期六10:00-16:30在中国北京举办! 这一次,我们将与社区演讲者一起谈论现代软件开发语言. ...
- 34.js----JS 开发者必须知道的十个 ES6 新特性
JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> ...
- Responsive设计的十个基本技巧(转)
什么是Responsive设计?有的同学认为Responsive设计是自适应布局,也有的同学认为Responsive是网格布局.其实这些想法都不正确.Wikipedia对Responsive做 了详细 ...
- 微软 Build 2016年开发者大会发布多项功能升级
微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collec ...
- SDCC 2016中国软件开发者大会十三大主题
SDCC中国软件开发者嘉年华(Software Developer Carnival China),是由全球最大中文IT社区CSDN于2007年创办的软件技术领域顶级盛会,将如约于2016年11月18 ...
- JS 开发者必须知道的十个 ES6 新特性
这篇文章会给你简单介绍一下ES6.如果你还不知道什么是ES6的话,它是JavaScript一个新的实现,如果你是一个忙碌的JavaScript开发者(但谁不是呢),那么继续读下去吧,看看当今最热门的语 ...
- Java开发者常犯的十个错误
翻译自:Top 10 Mistakes Java Developers Make 文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开 ...
- Chrome浏览器F12开发者工具的几个小技巧总结
1.直接修改页面元素 选择页面上元素,右键“检查”,会打开开发者工具窗口,显示当前选择元素的源代码,可以双击进行修改.如果要修改的东西比较多,可以折叠元素并单击选择,再右键Edit as HTML修改 ...
- [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]
Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往大吃苦头,我也不例外.这篇文章很细致地介绍了Golang的一些常见坑点,读完全篇中枪好多次.故将其 ...
随机推荐
- PCAP 抓包
PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的. WireShark也是用PCAP库来抓取数据包的.PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种 ...
- adb取出安装在手机中的apk
Android实战技巧之十八:adb取出安装在手机中的apk 场景: 朋友看见你Android手机中的游戏或应用很好玩,也想装一个此程序,但限于网络条件不能从网上下载.那么最简单的办法就是直接从你手机 ...
- VC++/MFC操作ini配置文件详解
在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINA ...
- GUI编程笔记(java)09:GUI控制文本框只能输入数字字符案例
1.首先我们看看我的需求,如下: 控制文本框只能输入数字字符 2.源代码: package cn.itcast_07; import java.awt.FlowLayout; import jav ...
- 所有Mac用户都需要知道的9个实用终端命令行<转>
转自 http://www.macx.cn/thread-2075903-1-1.html 通常情况下,只有高端用户才会经常用到终端应用.这并不意味着命令行非常难学,有的时候命令行可以轻松.快速的解决 ...
- 如何:确定调用 ASP.NET 网页的方式
如何:确定调用 ASP.NET 网页的方式 通常有必要了解调用 ASP.NET 网页的方式:是由原始请求 (HTTP GET).回发 (HTTP POST).来自其他页的跨页面发送 (HTTP POS ...
- oracle rowid 使用
ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
- 开源字体包缩减font-spider
最近公司产品用微软雅黑,被告~ 领导要求产品后台系统必须更换字体,美工给了个宋体,个人觉得太丑,就网上搜了些处理方法使用 CSS属性 @font-face 自定义字体, 最后决定用 思源黑体 (思源 ...
- PHP 单一入口
单一入口概述 单一入口的应用程序就是说用一个文件处理所有的HTTP请求,例如不管是列表页还是文章页,都是从浏览器访问index.php文件,这个文件就是这个应用程序的单一入口. 打个比方,大家都要上W ...
- 分享一个自己写的基于TP的关系模型(2)
1.增加多对多关系的处理 /** * 定义关系 * @return array */ public function test4(){ //参数说明 //关联的模型 //主表关联字段 //关联中间表 ...