阅读更多

0顶
0踩

数据库
【编者按】作为一款开源的对象—关系数据库,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做些同样的操作呢?下面这些设置都非常棒,你不妨试试:
  • 通过默认\x auto来获得更好的格式;
  • 使用\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-BNAME
\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中的输出也更具可读性。

原文地址:[url="http://www.craigkerstiens.com/2015/12/29/my-postgres-top-10-for-2016/ "]http://www.craigkerstiens.com/2015/12/29/my-postgres-top-10-for-2016/ [/url]
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 给DataGrid添加确定删除的功能

    给DataGrid添加确定删除的功能DataGrid的功能我想大家是知道的,我在实际的应用中遇到如下的问题,客户要求在删除之前做一次提示。类似于windows。首先我们都知道DataGrid支持删除的功能,我们可以向DataGrid里面添加删除列就可以实现,下面我想用模板列来实现带提示的删除按钮。我们用northwind的示例数据库作为例子数据库操纵Categories表。DataGr

  • DataGridView控件用法(二):为每行记录最后加“编辑”-“删除”按钮列

    1. 在DataGridView控件用法(一)中已经显示出列表数据,这时我们需要对每行数据记录进行编辑,需要添加“编辑”、“删除”、“查看”这样的超链接。代码如下: view source print? 1 //为每行数据增加编辑列。 2 //设定列不能自动作成 3 User

  • asp.net 后台弹出提示框

    asp.net 后台弹出提示框  1.后台弹出提示信息方法 Response.Write("alert('你所查询的数据不存在!');"); //弹出提示信息,但页面空白 Page.RegisterClientScriptBlock("tishi", "alert('你所查询的数据不存在');"); //弹出提示信息,但页面空白 Page.RegisterStartupScript("

  • ASP.NET中弹出消息框

    Response.Write("<script>alert('消息')</script>"); 特点:弹出的消息框是在一个新的空白页面中,用户必须关掉消息窗口后,才能继续显示页面内容。 原因:默认情况下,alert函数被添加到了页面的最前面,当其弹出之后,就会阻止页面内容的显示, 因此,用户看到的alert消息框的背景页面就是一片空白。 ...

  • datagrid的deleteRow使用

    问题形成: 项目中使用DataGrid的deleteRow进行删除操作时,会在前台逻辑删除该行数据,点击刷新时,已删除的数据会再次显现。 使用deleteRow删除一行时,它的index会进行改变,当我们再次进行删除时,如,点击当前页面的第一行时,它会删除掉第二行,而不是我们所希望删除的那一行数据。 网上看到了,使用如下方式进行删除。 $('#table_rw_dialog').datagr...

  • asp.net 加个弹出对话框

    平和、淡定asp.net,我对它没好感。工作需要,我要了解一点点。添加一个imageButton,弹出对话框的效果。<asp:ImageButton ID="dele" runat="server" OnClick="dele_Click" OnClientClick="if (!confirm('你确定要删除吗?')) return false;" ImageUrl="~/Image/dele.j

  • ASP.NET弹出下载提示框

    最近做了个pdf报告下载的链接,因为用的是链接文件的地址,所以,在没有安装pdf reader或者pdf插件的环境下会弹出下载提示框提示下载, 但在已经安装reader或者插件的环境下,点击链接地址后直接在网页中打开了pdf文件,这不是我期望的结果; 实现弹出框提示下载有很多种方法,我现在说的通过IIS设置的方法去实现: 注:网上有很多误导的设置方法:如图: 这样设置后会将页面上所...

  • DataGrid点击删除按钮弹出确认对话框一个好办法

    DataGrid点击删除按钮弹出确认对话框一个好办法 datagrid-》属性生成器-》列-》添加按钮列-》删除-》文本(T)->在文本框里加上:删除 

  • DataGrid删除操作

    首先加入删除按钮。之后:private void userData_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)        ...{            string tempName=userData.Items[e.Item.ItemIndex].Cells

  • asp.net 右下角弹出新提醒信息提示框

    asp.net 开发信息系统,无论是OA或者是其它业务系统中,都会用到新信息提醒功能,特此将方案跟大家分享一下。先上一图给大家看一看:优点:1)、该新消息弹出提示框样式算是比较不错的,个人认为。           2)、弹出框内的信息内容、提醒的个数、点击链接页面都封装在PopMessage.js中,你无须修改。           3)、使用简单,你只要根据你的需要修改PopMessageHa

Global site tag (gtag.js) - Google Analytics