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. 通过 pgstatstatements 来查看需要进行索引的地方

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

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

转自:http://news.oneapm.com/postgres/

时间: 2024-10-17 15:59:57

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

汇聚创新 共创未来---记2016华为开发者大赛沙龙深圳站

2016华为开发者大赛(HUAWEI Developer Challenge 2016)是华为公司面向全国开发者的大型软件竞赛,致力于通过华为全系产品领域的能力开放和全方位的开发支持服务,寻找创新的种子并共同孵化出创新的解决方案以推向华为优势市场,帮助开发者实现业务创新落地,成就开发者创新梦想. 7月10日,华为开发者大赛沙龙深圳站开启.深圳站主要聚焦华为Universe大数据.华为IoT链接管理平台.CloudOpera IES.Digital inCloud.集成通信能力.华为OMF平台及A

2016 年开发者头条十大文章

2016 年开发者头条十大获赞最多文章 | 年度盘点(一) 2016 年开发者头条十大收藏最多文章 | 年度盘点(二)

2016华为开发者大赛沙龙北京站,趁“热”来袭

2016华为开发者大赛(HUAWEI Developer Challenge 2016)是华为公司面向全国开发者的大型软件竞赛,致力于通过华为全系产品领域的能力开放和全方位的开发支持服务,寻找创新的种子并共同孵化出创新的解决方案以推向华为优势市场,帮助开发者实现业务创新落地,成就开发者创新梦想.竞赛内容涵盖云计算.IoT.Openlife.CaaS.聚合运营.移动开放工厂.大数据.BYOD.SDN.eLTE.企业通信.OpenIES和敏捷网络等华为开发者社区13个他们认为最有商业价值的领域.为全

浅谈《2016武汉开发者峰会》

2016武汉开发者峰会将于2016年3月26日下午13:00在光谷资本大厦二楼举办.本次大会针对武汉高端程序员和务实的创业者,联合武汉知名一线互联网公司的技术大咖,由简寻主办,联合腾讯众创空间.光谷金融,开启武汉首届线下高端技术分享会,与大家共聚武汉,分享技术创新与最佳实践. 1 if (!code) 2 { 3 return no bug: 4 }else{ 5 return bug: 6 } 前些天听说公司打算带我们去参加峰会,我的心情是无比激动和兴奋的,不仅仅是因为可以接触一些大牛,关键是

未来智能,触摸未来 ---记2016华为开发者大赛沙龙上海站

2016华为开发者大赛(HUAWEI Developer Challenge 2016)是华为公司面向全国开发者的大型软件竞赛,致力于通过华为全系产品领域的能力开放和全方位的开发支持服务, 寻找创新的种子并共同孵化出创新的解决方案以推向华为优势市场,帮助开发者实现业务创新落地,成就开发者创新梦想. 近日,华为开发者大赛沙龙上海站开启.上海站主要聚焦华为IoT联接管理平台生态开放API及应用,重点介绍华为IoT生态能力开放形态.应用方法和集成流程:集成通信能力,提升沟通体验,讲解华为基于电信网络开

34.JS 开发者必须知道的十个 ES6 新特性

JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> Promise 块级作用域的let和const 类 模块化 注意:这个列表十分主观并且带有偏见,其他未上榜的特性并不是因为没有作用,我这么做只是单纯的希望将这份列表中的项目保持在十个. 首先,一个简单的JavaScript时间线,不了解历史的人也无法创造历史. 1995年:JavaScript以LiveS

Responsive设计的十个基本技巧(转)

什么是Responsive设计?有的同学认为Responsive设计是自适应布局,也有的同学认为Responsive是网格布局.其实这些想法都不正确.Wikipedia对Responsive做 了详细的描述,我在这里就简单的说一下.Responsive设计简单的称为RWD,是精心提供各种设备都能阅读网页的一种设计方法,RWD能让你的网页 在不同的设备中展现成不同的设计风格.从这一点描述来说,Responsve既不是流体布局,也不是什么网格布局,他是一种独特的网页设计方法. Responsive设

响应式设计的十个基本技巧

英文原文:splio ,编译:w3cplus Responsive Design对于我来说一点都不陌生,从他在这个互联网出现的时候,就一直在观注他的成长,而且在w3cplus站上也分享了很多这方面的教程和资源.由于组织了YY活动在线上和大家分享Responsive的设计,为了能让大家更好的理解,我自己也有必要好好的做一下功课,今天这个就是功课,想和大家一起分享一下Responsive设计的一些基本技巧,和相对应的学习资源,希望对大家有所帮助. 什么是Responsive设计?有的同学认为Resp

SDCC 2016中国软件开发者大会十三大主题

SDCC中国软件开发者嘉年华(Software Developer Carnival China),是由全球最大中文IT社区CSDN于2007年创办的软件技术领域顶级盛会,将如约于2016年11月18日-20日再度震撼来袭.秉承干货实料的SDCC在今年相继走进了上海.深圳.成都.杭州等 地,一次又一次引爆当地技术圈,而本届大会有百场以上的深度技术讲座,话题涵盖了互联网架构.编程语言.大数据.研发管理.前端开发.微信开发.人工智 能.运维.直播技术等方面,旨在推动软件开发实践的深入交流与分享,为软