? ? ? ? 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ì)是完全開(kāi)源逃顶,允許免費(fèi)使用修改,甚至任何方式發(fā)布充甚,也就是不需要向任何人付任何費(fèi)用或版稅。因此PG已經(jīng)被很多的應(yīng)該程序包所使用霸褒,許多Linux發(fā)行版已經(jīng)把PostgreSQL作為它的基礎(chǔ)安裝伴找,或者包含在了安裝盤(pán)中。
那么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ā)讀寫(xiě),負(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ù),如下圖肥隆,填寫(xiě)完成服務(wù)器信息后點(diǎn)擊【確定】即可登錄pgAdmin主界面愕贡。
其命令與ORACLE基本相似,以下列舉幾個(gè)常用的巷屿。
pgAdmin還有一個(gè)優(yōu)勢(shì)就是自帶查看執(zhí)行計(jì)劃工具固以,那么如何快速查看PostgreSQL的執(zhí)行計(jì)劃?
進(jìn)入pgAdmin中嘱巾,點(diǎn)擊工具欄按鈕進(jìn)入sql窗口憨琳,如圖
輸入查詢(xún)語(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
查詢(xún)結(jié)果的所有字段的總寬度拌夏。這個(gè)參數(shù)并不是關(guān)鍵指標(biāo)僧著。
與執(zhí)行計(jì)劃相關(guān)的幾個(gè)參數(shù):
代價(jià)因子relpages為磁盤(pán)頁(yè),reltuples是行數(shù)障簿,一般比與實(shí)際值略小盹愚,因?yàn)閞elpages,reltuples數(shù)據(jù)不是實(shí)時(shí)更新的,一般在vacuum analyze和少部分DDL(如建立索引)后更新站故。
例如:suborder_info行數(shù)實(shí)際為798079皆怕,但查詢(xún)的reltuples結(jié)果卻為792691
一個(gè)普通的查詢(xún)所有記錄的語(yǔ)句,具體執(zhí)行的時(shí)候世蔗,首先要讀取磁盤(pán)頁(yè)面端逼,然后是把每一條記錄取出來(lái)。沒(méi)有索引污淋、排序顶滩、分組、循環(huán)等多余的運(yùn)算寸爆,所以其計(jì)劃類(lèi)型為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ì)劃提供額外的信息宵喂,如查詢(xún)字段信息等,默認(rèn)false
-costs:顯示執(zhí)行計(jì)劃的会傲,默認(rèn)true
-buffers:默認(rèn)false锅棕,前置條件是analyze
-format:默認(rèn)格式是text