初識(shí)PostgreSQL及其執(zhí)行計(jì)劃

? ? ? ? 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容