PostgreSQL 查詢(xún)性能調(diào)優(yōu)

當(dāng)前的項(xiàng)目蠢涝,生產(chǎn)系統(tǒng)有一個(gè)報(bào)表庫(kù),每晚通過(guò)批量導(dǎo)入和更新數(shù)據(jù)阅懦,每個(gè)月的數(shù)據(jù)在4000萬(wàn)左右和二,經(jīng)常CPU報(bào)警。
做了如下的優(yōu)化:

  1. 索引故黑,由于用戶(hù)的檢索方式基本都是重復(fù)性很高的。熱點(diǎn)字段就兩三個(gè)庭砍,做了索引场晶,優(yōu)化了一大截。
  2. 分區(qū)怠缸,通過(guò)分析诗轻,導(dǎo)致報(bào)警的語(yǔ)句,具有一個(gè)相同的特征揭北,就是用戶(hù)檢索時(shí)間范圍時(shí)扳炬,PostgreSQL無(wú)法命中索引(如果用to_char就可以命中)吏颖。暫時(shí)做了按時(shí)間分區(qū),進(jìn)而提升性能恨樟。
  3. 限制訪(fǎng)問(wèn)半醉,通過(guò)限制并發(fā)數(shù),保護(hù)數(shù)據(jù)庫(kù)劝术。
  4. 定時(shí)Vacuum和Analyze

前三項(xiàng)估計(jì)大家都很熟悉了缩多,這里重點(diǎn)說(shuō)一下Vacuum和Analyze。
Vacuum出現(xiàn)的原因是PostgreSQL不使用回滾段UNDO养晋,而是直接在表數(shù)據(jù)文件中進(jìn)行版本管理衬吆,導(dǎo)致表數(shù)據(jù)文件中出現(xiàn)大量的DEAD_TUP(可以通過(guò)pg_stat_*_tables來(lái)查看)。需要通過(guò)Vacuum進(jìn)行空間回收和壓縮绳泉。

有人說(shuō)逊抡,這種設(shè)計(jì)的好處是宕機(jī)時(shí),重啟后零酪,不需要對(duì)事務(wù)進(jìn)行redo和undo操作冒嫡,可以快速的進(jìn)入工作狀態(tài)。
這個(gè)好處的用處大家覺(jué)得大嗎蛾娶?很簡(jiǎn)單的道理灯谣,是數(shù)據(jù)庫(kù)的增刪改操作頻繁,還是宕機(jī)頻繁呢蛔琅。

當(dāng)然胎许,PostgreSQL已經(jīng)設(shè)計(jì)成這樣了,那么只能在其規(guī)則下進(jìn)行優(yōu)化了罗售。

接下來(lái)辜窑,通過(guò)測(cè)試數(shù)據(jù)對(duì)其進(jìn)行分析。

報(bào)表庫(kù)的特點(diǎn)就是寨躁,大批量操作進(jìn)行數(shù)據(jù)初始化穆碎,之后數(shù)據(jù)就固定了,不會(huì)發(fā)生變化职恳。
測(cè)試場(chǎng)景也模仿這樣的設(shè)計(jì):
創(chuàng)建100萬(wàn)條記錄所禀,然后并發(fā)事務(wù)進(jìn)行數(shù)據(jù)更新,觀(guān)察表數(shù)據(jù)文件的變化和查詢(xún)語(yǔ)句的性能變化放钦。

通過(guò)測(cè)試發(fā)現(xiàn):
進(jìn)行插入和大量更新操作之后色徘,產(chǎn)生了大量的dead_tup。
postgreSQL的autovacuum和autoanalyze有一定效果操禀,但是沒(méi)有到極致褂策。

SQL執(zhí)行時(shí)間分別如下:

精準(zhǔn)檢索(索引掃描):5ms
統(tǒng)計(jì)SQL(全表掃描):15478ms

觸發(fā)autovacuum之后

精準(zhǔn)檢索(索引掃描):3.5ms
統(tǒng)計(jì)SQL(全表掃描):78862ms(這個(gè)數(shù)據(jù)極其異常)

觸發(fā)autoanalyze之后

精準(zhǔn)檢索(索引掃描):3.3ms
統(tǒng)計(jì)SQL(全表掃描):18920ms

可以看到,autovacuum和autoanalyze之后,命中索引的檢索性能有所提升斤寂,但是全表掃描的統(tǒng)計(jì)SQL耿焊,性能反而下降了。

手動(dòng)執(zhí)行ANALYZE之后遍搞,性能又有所提升罗侯。

精準(zhǔn)檢索(索引掃描):3.5ms
統(tǒng)計(jì)SQL(全表掃描):8419ms

可以看到,全表掃描的這種情況已經(jīng)大幅優(yōu)化了尾抑。

手動(dòng)執(zhí)行VACUUM之后歇父,性能又提升了很多。

精準(zhǔn)檢索(索引掃描):3.4ms
統(tǒng)計(jì)SQL(全表掃描):1552ms

至此再愈,已經(jīng)大幅提升了榜苫,PostgreSQL是不建議進(jìn)行VACUUM FULL操作的,但既然保留了這個(gè)功能翎冲,肯定是有其存在的場(chǎng)景的垂睬。
所以,再?lài)L試一下VACUUM FULL抗悍。

精準(zhǔn)檢索(索引掃描):2.3ms
統(tǒng)計(jì)SQL(全表掃描):875ms

通過(guò)觀(guān)察驹饺,經(jīng)過(guò)AUTOVACUUM和VACUUM操作后,文件空間是不會(huì)發(fā)生變化的缴渊。經(jīng)過(guò)VACUUM后赏壹,文件空間直接被壓縮了幾倍(32GB -> 5GB)。

如果你的應(yīng)用場(chǎng)景也是衔沼,批量導(dǎo)入和更新數(shù)據(jù)后蝌借,數(shù)據(jù)只是對(duì)外提供只讀操作。
那么在批量程序運(yùn)行完畢之后指蚁,進(jìn)行一次VACUUM FULL和VACUUM以及ANALYZE菩佑,說(shuō)不定會(huì)有驚喜。

可以索引命中的檢索語(yǔ)句的優(yōu)化情況
全表掃描的統(tǒng)計(jì)SQL
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凝化,一起剝皮案震驚了整個(gè)濱河市稍坯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搓劫,老刑警劉巖瞧哟,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異枪向,居然都是意外死亡勤揩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)遣疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雄可,“玉大人,你說(shuō)我怎么就攤上這事缠犀∈唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辨液,是天一觀(guān)的道長(zhǎng)虐急。 經(jīng)常有香客問(wèn)我,道長(zhǎng)滔迈,這世上最難降的妖魔是什么止吁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮燎悍,結(jié)果婚禮上敬惦,老公的妹妹穿的比我還像新娘。我一直安慰自己谈山,他們只是感情好俄删,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奏路,像睡著了一般畴椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽粉,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天斜脂,我揣著相機(jī)與錄音,去河邊找鬼触机。 笑死帚戳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的威兜。 我是一名探鬼主播销斟,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椒舵!你這毒婦竟也來(lái)了蚂踊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笔宿,失蹤者是張志新(化名)和其女友劉穎犁钟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泼橘,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涝动,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炬灭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醋粟。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出米愿,到底是詐尸還是另有隱情厦凤,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布育苟,位于F島的核電站较鼓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏违柏。R本人自食惡果不足惜博烂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漱竖。 院中可真熱鬧禽篱,春花似錦、人聲如沸馍惹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讼积。三九已至肥照,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勤众,已是汗流浹背舆绎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留们颜,地道東北人吕朵。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窥突,于是被迫代替她去往敵國(guó)和親努溃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350