? ? ? ? PostgreSQL?? 是一種先進的SQL數(shù)據(jù)庫服務(wù)軟件,可在大量的平臺上運行(比如我們身邊數(shù)據(jù)量非常之大的銀行一賬通系統(tǒng)、商城系統(tǒng)),且是一款支持大量平臺的高級SQL數(shù)據(jù)服務(wù)軟件。PostgreSQL最大的優(yōu)勢是完全開源,允許免費使用修改,甚至任何方式發(fā)布,也就是不需要向任何人付任何費用或版稅。因此PG已經(jīng)被很多的應(yīng)該程序包所使用,許多Linux發(fā)行版已經(jīng)把PostgreSQL作為它的基礎(chǔ)安裝,或者包含在了安裝盤中。
那么PostgreSQL優(yōu)勢又有哪些?
? ? 穩(wěn)定性強,SQL標(biāo)準(zhǔn)支持較好
? ? 支持PL/pgSQL等多種過程語言
? ? 支持視圖、分析函數(shù)、CTE等高級特性
? ? OLAP性能超過MySQL
? ? 占用空間小,vacuum方便整理無用的歷史數(shù)據(jù)
? ? 高并發(fā)讀寫,負(fù)載下,PG性能指標(biāo)較MySQL穩(wěn)定
? ? 基于函數(shù)、條件以及cost的SQL優(yōu)化,易于調(diào)優(yōu)
? ? 已有訪問Mysql、Redis、文本等外部數(shù)據(jù)源插件
? ? 支持快照增量備份,支持快速rollback
? ? 執(zhí)行計劃共享
獲取PostgreSQL
下載源碼或用于各種操作系統(tǒng)的二進制包:https://www.postgresql.org/download/
網(wǎng)上針對不同環(huán)境下如何安裝PG數(shù)據(jù)都有詳細(xì)的教程,這里提供幾個鏈接供參考:
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
以下簡單介紹pgAdmin3客戶端應(yīng)用程序,其工作原理是用來發(fā)送SQL到PostgreSQL,并快速和簡單地顯示結(jié)果。以1.22.1版本為栗
當(dāng)首次啟東pgAdmin時,會提示注冊服務(wù),如下圖,填寫完成服務(wù)器信息后點擊【確定】即可登錄pgAdmin主界面。
其命令與ORACLE基本相似,以下列舉幾個常用的。
pgAdmin還有一個優(yōu)勢就是自帶查看執(zhí)行計劃工具,那么如何快速查看PostgreSQL的執(zhí)行計劃?
進入pgAdmin中,點擊工具欄按鈕進入sql窗口,如圖
輸入查詢語句,
select tablename from pg_tables;
快捷鍵F7即可看到語句的執(zhí)行計劃。
下面簡單介紹一下執(zhí)行計劃結(jié)果各字段含義:
1、?Cost
cost是比較重要的指標(biāo),比如第二個例子中的cost=0.42..8.44有兩個部分,啟動時間(startup)=0.42ms 和總時間(total)=8.44ms。其中啟東時間是執(zhí)行到返回第一行時需要的cost值,且都是預(yù)測值。
2、?Rows
預(yù)測的行數(shù)。與實際的行數(shù)可能有出入,經(jīng)常vacuum或者analyze的話,這個值和實際值將更加接近。
3、?Width
查詢結(jié)果的所有字段的總寬度。這個參數(shù)并不是關(guān)鍵指標(biāo)。
與執(zhí)行計劃相關(guān)的幾個參數(shù):
代價因子relpages為磁盤頁,reltuples是行數(shù),一般比與實際值略小,因為relpages,reltuples數(shù)據(jù)不是實時更新的,一般在vacuum analyze和少部分DDL(如建立索引)后更新。
例如:suborder_info行數(shù)實際為798079,但查詢的reltuples結(jié)果卻為792691
一個普通的查詢所有記錄的語句,具體執(zhí)行的時候,首先要讀取磁盤頁面,然后是把每一條記錄取出來。沒有索引、排序、分組、循環(huán)等多余的運算,所以其計劃類型為Seq Scan,代價計算公式為:
relpages * seq_page_cost + reltuples * cpu_tuple_cost =16472*1+792691*0.01=24398.91
因為relpages,reltuples數(shù)據(jù)不是實時更新的,導(dǎo)致計算結(jié)果存在一定的差異。但在分析是否有調(diào)優(yōu)空間時,這點差距并不影響我們的判斷結(jié)果。
Explain Analyze可查看實際執(zhí)行時候的執(zhí)行計劃,
#Explain Analyze select * from suborder_info where sub_order_no=’20170616013062821’;
loops:循環(huán)的次數(shù)。
Planning time:計劃時間
Execution time:執(zhí)行時間
查看執(zhí)行計劃,一般我們會關(guān)注消耗值cost和掃描的方式,如走索引或者full scan全表掃描。當(dāng)COST值消耗比較大時需要注意是否有優(yōu)化的可能,并進一步調(diào)試。
另附explain命令可帶參數(shù):
-analyze:執(zhí)行命令并顯示執(zhí)行事件,默認(rèn)false
-verbose:對執(zhí)行計劃提供額外的信息,如查詢字段信息等,默認(rèn)false
-costs:顯示執(zhí)行計劃的,默認(rèn)true
-buffers:默認(rèn)false,前置條件是analyze
-format:默認(rèn)格式是text