【編者按】做爲一款開源的對象—關係數據庫,Postgres 一直獲得許多開發者喜好。近日,Postgres 正式發佈了9.5版本,該版本進行了大量的修復和功能改進。而本文將分享10個 Postgres 使用技巧,旨在讓開發者能更加靈活和高效地使用這個數據庫。linux
放假期間,不少人會選擇去閱讀一些新書或者學一些新技術來充實本身。下面筆者將推薦一些Postgres技巧和技能給你們,這些技巧會幫助你更加靈活方便地使用 Postgres。若是你以爲這些技巧會對你產生幫助,你能夠選擇訂閱 Postgres weekly,本週都會發布一些Postgres最新的資訊和技術乾貨。sql
1.CTEs——Common Table Expressions數據庫
CTE 容許你作一些很棒的事情,好比遞歸查詢,即便是用在一些最簡單的語句操做上,CET 都會有很出色的表現。 CTE 能夠認爲是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句的執行範圍內定義的臨時結果集。CTE 與派生表相似,具體表如今不存儲爲對象,而且只在查詢期間有效。與派生表的不一樣之處在於,CTE 可自引用,還可在同一查詢中引用屢次。這樣開發者就能夠更容易地建立可讀查詢。json
開發者在建立 SQL 語句的時候,每每會有不少行,有的甚至超過上百行,而經過使用4-5個 CETs 後,語句會縮短不少,這樣就很容易提升語句的可讀性,尤爲是對於新人來講。vim
2.安裝一個.psqlrcwindows
若是安裝了 bashrc、vimrc 等文件,那爲何不對 Postgres 作些一樣的操做呢?下面這些設置都很是棒,你不妨試試:安全
經過默認來得到更好的格式;bash
使用\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 性能方面的東西。
若是有大量的微服務或不一樣的應用程序,那麼可能須要不少不一樣的數據庫來支持它們。默認狀況是建立一些數據倉庫並經過 ETL 鏈接,可是這樣作有時候過重度了。這時候,你只須要將數據庫一次性集中在一塊兒,或者在少數狀況下,外部數據封裝器能夠容許你跨多個數據庫查詢,好比 Postgres 到Postgres,或者是 Postgres 到 Mongo 或 Redis 數據庫之類。
在開發應用程序時,不多會徹底不用 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
你可能不熟悉 materialized views(物化視圖),materialized views 是包括一個查詢結果的數據庫對像。因此,它是一些查詢或「view」的一個物化的或基本的快照版本。在最開始的物化版本中,會在 Postgres 創建一個常請求,但總體是不可用的。那是由於當你鎖定事務的時候,有可能會阻礙一些其它讀取和活動。
如今已經好不少,但仍然缺少一些開箱即用的工具來進行刷新。這也就意味着你必須安裝一些調度任務或 cron 做業來按期刷新物化視圖。若是你目前正在開發一些報告或者 BI 應用程序,那麼你仍是須要使用物化視圖的。它們的可用性正在不斷提高,因此,Postgres 已經知道如何自動化刷新它們。
窗口函數(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的博客查看具體示例。
PostGIS 能夠說是全部 GIS 數據庫中最好的一個了。事實上,開發者得到的全部 Postgres 標準會使它更增強大——一個最好的例子是來自 Postgres 近年來的 GiST 索引,它給 PostGIS 提供了極大的性能提高。 若是你如今正在作一些與地理空間數據有關的事情,而且須要一些比 earth_distance 擴展更好用的工具,那麼 PostGIS 就是你最佳選擇。
從 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 官方博客