? ? ? ? PostgreSQL?? 是一種先進(jìn)的SQL數(shù)據(jù)庫(kù)服務(wù)軟件,可在大量的平臺(tái)上運(yùn)行(比如我們身邊數(shù)據(jù)量非常之大的銀行一賬通系統(tǒng)、商城系統(tǒng)),且是一款支持大量平臺(tái)的高級(jí)SQL數(shù)據(jù)服務(wù)軟件。PostgreSQL最大的優(yōu)勢(shì)是完全開源,允許免費(fèi)使用修改,甚至任何方式發(fā)布,也就是不需要向任何人付任何費(fèi)用或版稅。因此PG已經(jīng)被很多的應(yīng)該程序包所使用,許多Linux發(fā)行版已經(jīng)把PostgreSQL作為它的基礎(chǔ)安裝,或者包含在了安裝盤中。
那么PostgreSQL優(yōu)勢(shì)又有哪些?
? ? 穩(wěn)定性強(qiáng),SQL標(biāo)準(zhǔn)支持較好
? ? 支持PL/pgSQL等多種過(guò)程語(yǔ)言
? ? 支持視圖、分析函數(shù)、CTE等高級(jí)特性
? ? OLAP性能超過(guò)MySQL
? ? 占用空間小,vacuum方便整理無(wú)用的歷史數(shù)據(jù)
? ? 高并發(fā)讀寫,負(fù)載下,PG性能指標(biāo)較MySQL穩(wěn)定
? ? 基于函數(shù)、條件以及cost的SQL優(yōu)化,易于調(diào)優(yōu)
? ? 已有訪問(wèn)Mysql、Redis、文本等外部數(shù)據(jù)源插件
? ? 支持快照增量備份,支持快速rollback
? ? 執(zhí)行計(jì)劃共享
獲取PostgreSQL
下載源碼或用于各種操作系統(tǒng)的二進(jìn)制包:https://www.postgresql.org/download/

網(wǎng)上針對(duì)不同環(huán)境下如何安裝PG數(shù)據(jù)都有詳細(xì)的教程,這里提供幾個(gè)鏈接供參考:
Linux:http://www.cnblogs.com/qiyebao/p/4562557.html
MacOS:http://www.cnblogs.com/shineqiujuan/p/4703304.html
Windows:http://blog.chinaunix.net/uid-354915-id-3498734.html
目前遠(yuǎn)程連接PostgreSQL圖形化工具已有一系列可選工具,下面兩款是最流行的:
pgAdmin3
phpPgAdmin
以下簡(jiǎn)單介紹pgAdmin3客戶端應(yīng)用程序,其工作原理是用來(lái)發(fā)送SQL到PostgreSQL,并快速和簡(jiǎn)單地顯示結(jié)果。以1.22.1版本為栗

當(dāng)首次啟東pgAdmin時(shí),會(huì)提示注冊(cè)服務(wù),如下圖,填寫完成服務(wù)器信息后點(diǎn)擊【確定】即可登錄pgAdmin主界面。



其命令與ORACLE基本相似,以下列舉幾個(gè)常用的。
pgAdmin還有一個(gè)優(yōu)勢(shì)就是自帶查看執(zhí)行計(jì)劃工具,那么如何快速查看PostgreSQL的執(zhí)行計(jì)劃?
進(jìn)入pgAdmin中,點(diǎn)擊工具欄按鈕進(jìn)入sql窗口,如圖

輸入查詢語(yǔ)句,
select tablename from pg_tables;
快捷鍵F7即可看到語(yǔ)句的執(zhí)行計(jì)劃。


下面簡(jiǎn)單介紹一下執(zhí)行計(jì)劃結(jié)果各字段含義:
1、?Cost
cost是比較重要的指標(biāo),比如第二個(gè)例子中的cost=0.42..8.44有兩個(gè)部分,啟動(dòng)時(shí)間(startup)=0.42ms 和總時(shí)間(total)=8.44ms。其中啟東時(shí)間是執(zhí)行到返回第一行時(shí)需要的cost值,且都是預(yù)測(cè)值。
2、?Rows
預(yù)測(cè)的行數(shù)。與實(shí)際的行數(shù)可能有出入,經(jīng)常vacuum或者analyze的話,這個(gè)值和實(shí)際值將更加接近。
3、?Width
查詢結(jié)果的所有字段的總寬度。這個(gè)參數(shù)并不是關(guān)鍵指標(biāo)。
與執(zhí)行計(jì)劃相關(guān)的幾個(gè)參數(shù):

代價(jià)因子relpages為磁盤頁(yè),reltuples是行數(shù),一般比與實(shí)際值略小,因?yàn)閞elpages,reltuples數(shù)據(jù)不是實(shí)時(shí)更新的,一般在vacuum analyze和少部分DDL(如建立索引)后更新。
例如:suborder_info行數(shù)實(shí)際為798079,但查詢的reltuples結(jié)果卻為792691


一個(gè)普通的查詢所有記錄的語(yǔ)句,具體執(zhí)行的時(shí)候,首先要讀取磁盤頁(yè)面,然后是把每一條記錄取出來(lái)。沒有索引、排序、分組、循環(huán)等多余的運(yùn)算,所以其計(jì)劃類型為Seq Scan,代價(jià)計(jì)算公式為:
relpages * seq_page_cost + reltuples * cpu_tuple_cost =16472*1+792691*0.01=24398.91
因?yàn)閞elpages,reltuples數(shù)據(jù)不是實(shí)時(shí)更新的,導(dǎo)致計(jì)算結(jié)果存在一定的差異。但在分析是否有調(diào)優(yōu)空間時(shí),這點(diǎn)差距并不影響我們的判斷結(jié)果。

Explain Analyze可查看實(shí)際執(zhí)行時(shí)候的執(zhí)行計(jì)劃,
#Explain Analyze select * from suborder_info where sub_order_no=’20170616013062821’;

loops:循環(huán)的次數(shù)。
Planning time:計(jì)劃時(shí)間
Execution time:執(zhí)行時(shí)間
查看執(zhí)行計(jì)劃,一般我們會(huì)關(guān)注消耗值cost和掃描的方式,如走索引或者full scan全表掃描。當(dāng)COST值消耗比較大時(shí)需要注意是否有優(yōu)化的可能,并進(jìn)一步調(diào)試。
另附explain命令可帶參數(shù):
-analyze:執(zhí)行命令并顯示執(zhí)行事件,默認(rèn)false
-verbose:對(duì)執(zhí)行計(jì)劃提供額外的信息,如查詢字段信息等,默認(rèn)false
-costs:顯示執(zhí)行計(jì)劃的,默認(rèn)true
-buffers:默認(rèn)false,前置條件是analyze
-format:默認(rèn)格式是text