Postgresql 查看SQL語句執(zhí)行效率的操作
Explain命令在解決數(shù)據(jù)庫性能上是第一推薦使用命令,大部分的性能問題可以通過此命令來簡單的解決,Explain可以用來查看 SQL 語句的執(zhí)行效 果,可以幫助選擇更好的索引和優(yōu)化查詢語句,寫出更好的優(yōu)化語句。
Explain語法:
explain select … from … [where ...]
例如:
explain select * from dual;
這里有一個(gè)簡單的例子,如下:
EXPLAIN SELECT * FROM tenk1;
QUERY PLAN
----------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)
EXPLAIN引用的數(shù)據(jù)是:
1). 預(yù)計(jì)的啟動(dòng)開銷(在輸出掃描開始之前消耗的時(shí)間,比如在一個(gè)排序節(jié)點(diǎn)里做排續(xù)的時(shí)間)。
2). 預(yù)計(jì)的總開銷。
3). 預(yù)計(jì)的該規(guī)劃節(jié)點(diǎn)輸出的行數(shù)。
4). 預(yù)計(jì)的該規(guī)劃節(jié)點(diǎn)的行平均寬度(單位:字節(jié))。
這里開銷(cost)的計(jì)算單位是磁盤頁面的存取數(shù)量,如1.0將表示一次順序的磁盤頁面讀取。其中上層節(jié)點(diǎn)的開銷將包括其所有子節(jié)點(diǎn)的開銷。這里的輸出行數(shù)(rows)并不是規(guī)劃節(jié)點(diǎn)處理/掃描的行數(shù),通常會(huì)更少一些。一般而言,頂層的行預(yù)計(jì)數(shù)量會(huì)更接近于查詢實(shí)際返回的行數(shù)。
現(xiàn)在我們執(zhí)行下面基于系統(tǒng)表的查詢:
SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';
從查詢結(jié)果中可以看出tenk1表占有358個(gè)磁盤頁面和10000條記錄,然而為了計(jì)算cost的值,我們?nèi)匀恍枰懒硗庖粋€(gè)系統(tǒng)參數(shù)值。
postgres=# show cpu_tuple_cost; cpu_tuple_cost ---------------- 0.01 (1 row) cost = 458(磁盤頁面數(shù)) + 10000(行數(shù)) * 0.01(cpu_tuple_cost系統(tǒng)參數(shù)值
補(bǔ)充:postgresql SQL COUNT(DISTNCT FIELD) 優(yōu)化
背景
統(tǒng)計(jì)某時(shí)段關(guān)鍵詞的所有總數(shù),也包含null (statistics 有400w+的數(shù)據(jù),表大小為 600M),故
寫出sql:
select count(distinct keyword) +1 as count from statistics;
問題
雖然是后臺(tái)查詢,但是太慢了,執(zhí)行時(shí)間為為 38.6s,那怎么優(yōu)化呢?
解決
方法1(治標(biāo))
把這個(gè)定時(shí)執(zhí)行,然后把sql結(jié)果緩存下,然后程序訪問緩存結(jié)果,頁面訪問是快了些,但是本質(zhì)上還沒有解決sql執(zhí)行慢的問題。
方法2(治本)
優(yōu)化sql,首先說說 count( distinct FIELD) 為啥這么慢,此處不再贅述了,請(qǐng)看這篇:http://www.dhdzp.com/article/65680.htm
優(yōu)化內(nèi)容:
select count( distinct FIELD ) from table
修改為
select count(1) from (select distinct FIELD from table) as foo;
比較
執(zhí)行過程比對(duì),可以使用 explian anaylze sql語句 查看
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Postgresql使用update語句的方法示例
- PostgreSQL實(shí)時(shí)查看數(shù)據(jù)庫實(shí)例正在執(zhí)行的SQL語句實(shí)例詳解
- postgresql SQL語句變量的使用說明
- Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個(gè)事務(wù)
- postgresql 賦權(quán)語句 grant的正確使用說明
- PostgreSQL標(biāo)準(zhǔn)建表語句分享
- postgresql 導(dǎo)出建表語句的命令操作
- postgresql 實(shí)現(xiàn)sql多行語句合并一行
- Postgresql ALTER語句常用操作小結(jié)
- Postgresql開啟SQL執(zhí)行語句收集過程
相關(guān)文章
postgresql 實(shí)現(xiàn)sql多行語句合并一行
這篇文章主要介紹了postgresql 實(shí)現(xiàn)sql多行語句合并一行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
PostgreSQL中的日期/時(shí)間函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于PostgreSQL中日期/時(shí)間函數(shù)的相關(guān)資料,文章通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法總結(jié)
這篇文章主要給大家介紹了PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一點(diǎn)的幫助,需要的朋友可以參考下2023-10-10
使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng)的方法
這篇文章主要介紹了使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng),下面使用一個(gè)具體的例子來說明如何使用PostgreSQL的json數(shù)據(jù)類型來建立用戶標(biāo)簽數(shù)據(jù),需要的朋友可以參考下2022-10-10
使用postgresql 模擬批量數(shù)據(jù)插入的案例
這篇文章主要介紹了使用postgresql 模擬批量數(shù)據(jù)插入的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Postgresql psql文件執(zhí)行與批處理多個(gè)sql文件操作
這篇文章主要介紹了Postgresql psql文件執(zhí)行與批處理多個(gè)sql文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01

