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 官方博客

时间: 2024-10-10 10:21:30

2016 年开发者应该掌握的十个 Postgres 技巧的相关文章

让你编程得到升华:开发者需知的十个真理

编程是一种有益的体验方式,当遇到挑战时,我们会不断寻求新的解决方法.也许你会认为将毅力.直觉.适宜的工具三个组合在一起即可编写出优雅.完美的代码.然而,随之而来的拙劣的部署或另一种功能需求亦或者是沉重的依赖关系会产生不良的迭代更新,等等这些突发状况会摧毁了你最初的梦想. 开发者需知的十个真理-"> 我们希望每次的努力付出能够有着深远的影响,希望我们的应用程序所依赖的服务器如同磐石一样,然而编程的获取方式却是残酷的.这并不意味着你所有的努力都是有价值的.相反,我们应该学会如何面对这些残酷的事

SDCC 2016 中国软件开发者大会盛大开幕

2016年11月18-20日,由 CSDN打造的"SDCC 2016中国软件开发者大会"(以下简称SDCC 2016),在北京京都信苑饭店盛大开幕.大会为期三天,汇聚100多位国内外顶尖专家和知名讲师,全体大会探讨当下软件开发的"新趋势"与"新实践",而14场专题论坛则直击开发者关注的技术和行业实践, "英雄会"晚宴和特色活动也异彩纷呈.SDCC 2016致力将最前沿的软件开发技术,以及最具创新的实践案例带给开发者,是国内软件

聚焦技术实战!MDCC 2016 移动开发者大会盛大开幕

9 月 23 日 - 24日,"MDCC 2016 移动开发者大会 中国"(Mobile Developer Conference China 2016,简称 MDCC 2016)在北京 国家会议中心隆重召开.本次大会由全球最大中文 IT 社区 CSDN 和中国最具关注度的全方位创业平台创新工场联合主办,以移动领域热点技术+典型应用案例实战为主的内容主旨,邀请国内外顶尖技术大牛.业界领袖,在实战经验中剖析技术方案与趋势,共同致力于推动中国移动互联网生态系统的成长. 本届 MDCC 除全

开发者需掌握的11条技巧

 开发者需掌握的11条技巧-开发者选项设置技巧"> 现在程序开发者在应用程序上投入的精力丝毫不比实业创业者们少,但想要做好程序开发并不像想象中那么简单.这也是为什么有的程序具有操作性强.趣味性强.实用等明显优势,深受用户喜爱;而有的程序就仅仅如昙花一现,瞬间消失在用户的视野中. 为了探究如何能使应用程序让用户喜欢并且爱不释手,我们对话了一些年轻成功的程序开发者,针对"开发程序时最不容忽视的问题是什么"向他们提问,下面十一条是他们给出的最有建设性意见的建议.其中一些针对程

41个Web开发者必须收藏的JavaScript实用技巧_javascript技巧

Web开发者必须收藏的JavaScript实用技巧,供大家参考,具体内容如下 1. 将彻底屏蔽鼠标右键 oncontextmenu="window.event.returnValue=false" < table border oncontextmenu=return(false)>< td>no< /table> 可用于 Table 2. 取消选取.防止复制 < body onselectstart="return false&qu

微软 SQL Server 2016 SP1 开发者版入驻 Windows 容器

2月22日有消息称微软今天宣布在Windows Containers容器中上线SQL Server2016 SP1开发者版.用户可以在Docker Hub中找到镜像,可用于Windows Server容器和Hyper-V容器中. 在Windows容器中,SQL Server 2016可为用户提供以下脚本使用: • 为开发和测试快速创建和启动一套SQL Server实例 • 在测试或产品环境中最大化密度,特别是微服务架构 • 在多租户架构中隔离和控制应用 要了解更多详情,请点击这里进入GitHub

三星A7(2016) SM-A7108开发者选项开启方法

注意:开发者选项通过下面的方法激活之后我们就无法再隐藏了,如果要隐藏只有恢复手机出厂设置了,这个问题请大家知晓. 1.在三星A7(2016) SM-A7108标准模式下,向左滑动屏幕.    2.点击三星A7(2016) SM-A7108进入到的界面中的[设置]选项,如下所示.    3.之后进入后我们找到设置列表中的[关于手机].    4.点击[软件信息].    5.连续点击[版本号]7次后,将提示"开发者模式已启用".      6.点击[←]然后点击返回上级,在上级界面中我们

微软 Build 2016年开发者大会发布多项功能升级

微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collection).生物识别技术Windows Hello支持Edge浏览器以及将通用应用平台(UWP)扩大到Xbox游戏主机等.此外,Win10周年升级包适用于PC.平板.手机.Xbox One.Hololens以及物联网(IOT)设备.一直以来Build大会都作为微软的生态发展和未来规划的风向标被外界广

让你编程得到升华:开发者需知的十个真理【转载】

看来几次,受益匪浅.转下,慢慢领悟. [CSDN编译]编程是一种有益的体验方式,当遇到挑战时,我们会不断寻求新的解决方法.也许你会认为将毅力.直觉.适宜的工具三个组合在一起即可编写出优雅.完美的代码.然而,随之而来的拙劣的部署或另一种功能需求亦或者是沉重的依赖关系会产生不良的迭代更新,等等这些突发状况会摧毁了你最初的梦想. 我们希望每次的努力付出能够有着深远的影响,希望我们的应用程序所依赖的服务器如同磐石一样,然而编程的获取方式却是残酷的.这并不意味着你所有的努力都是有价值的.相反,我们应该学会