表膨脹的產(chǎn)生
我們知道Oracle的多版本并發(fā)控制是基于塊級的,利用回滾段(UNDO)機制。在回滾段中保存了某個數(shù)據(jù)被修改之前的前映像的數(shù)據(jù)。而PostgreSQL中沒有UNDO這一概念,PostgreSQL中的多版本并發(fā)是通過在表中數(shù)據(jù)行的多個版本來實現(xiàn)的,例如在一張表中我們要更新一條記錄,PG并不是直接修改該數(shù)據(jù),而是通過插入一條全新的數(shù)據(jù),同時對老數(shù)據(jù)加以標(biāo)識。
PostgreSQL的MVCC機制在數(shù)據(jù)更新時會產(chǎn)生死元組(dead tuples),如果果不清理掉那些dead tuples(對任何事務(wù)都是不可見的)將會永遠(yuǎn)留在數(shù)據(jù)文件中,浪費磁盤空間,對于表來說,有過多的刪除和更新,dead tuples很容易占絕大部分磁盤空間。而且dead tuples也會在索引中存在,更加加重磁盤空間的浪費。這在PostgreSQL中稱之為膨脹(bloat)。自然的,需要處理的數(shù)據(jù)查詢越多,查詢的速度就越慢。
表膨脹的查詢
查詢表膨脹可以使用插件pgstattuple,提供了pgstatetuple()和pgstatindex()兩個統(tǒng)計表和索引的方法。
初次使用這個插件時需要創(chuàng)建:
創(chuàng)建測試表:
查看表的死元組,可以看到剛建的表死元組為0,表膨脹系數(shù)0:
做些DML操作,觀察表的死元組占比13%,表的膨脹系數(shù)34%:
表膨脹的清理
1. 執(zhí)行 vacuum清理死元組,清理后表的死元組為0,表的膨脹系數(shù)還是34%:
可見vacuum命令通常不會將磁盤空間返回給操作系統(tǒng),但它將使它對新行可用。這時我們需要使用vacuum full 命令來回收空間。
注意:vacuum full 會回收空間并返回給操作系統(tǒng),但是它有很多缺點。首先,它會產(chǎn)生獨立鎖,阻塞所有操作(包括select).其次,它實際上創(chuàng)建了一個表的副本,使所需的磁盤空間加倍,因此當(dāng)系統(tǒng)可用磁盤空間很少時,就不太實用。
2. 插件實現(xiàn):
vacuum full會產(chǎn)生獨立鎖,阻塞所有操作(包括select),我們可以使用插件pg_squeeze來完成這個操作,它使用REDO和logical replication實現(xiàn)增量重組,不需要建立觸發(fā)器,但是要求表上面有PK或者UK。
由于pg_squeeze需要使用logical replication,所以必須設(shè)置足夠多的slots,而且必須注意可能與STANDBY爭搶SLOTS,必須預(yù)留足夠的SLOTS。
使用示例 squeeze.squeeze_table(tabchema name, tabname name,
clustering_index name, rel_tablespace name, ind_tablespaces name[]):
另外由于pg_squeeze可以自動,也可以不設(shè)置自動的收縮。對于自動的收縮,建議不要對繁忙的數(shù)據(jù)庫開啟,以免在高峰期觸發(fā),帶來一定的性能影響。
--注冊任務(wù)(示例表示:public下的表test,在每天的23:10分檢查,當(dāng)表的空閑空間超過10時對表重建) insert into squeeze.tables (tabschema, tabname, schedule, free_space_extra) values (public, test, ({10}, {23}, NULL, NULL, NULL), 10); --查看任務(wù) select * from squeeze.tables; --開啟進(jìn)程 select squeeze.start_worker(); --查看任務(wù)記錄 select * from squeeze.tables_internal; --關(guān)閉進(jìn)程 select squeeze.stop_worker(); |
任務(wù)完成后可以查看任務(wù)記錄:
更多精彩干貨分享
點擊下方名片關(guān)注
IT那活兒
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/129797.html
摘要:本文以為例來介紹如何打造自己的搜索引擎。其官方網(wǎng)站是可以說支持包括英文中文等所有語言的搜索。默認(rèn)把中文按字拆分的,但這樣就會產(chǎn)生搜索出不相干的內(nèi)容來。因此,有人就給打了中文分詞的補丁。 Google搜索引擎建立至今已經(jīng)快20年了,之后全球各類大大小小類似的搜索引擎也陸續(xù)出現(xiàn)、消亡。國內(nèi)目前以百度為大,搜狗、360、必應(yīng)等也勢在必爭。搜索引擎技術(shù)也發(fā)展的相當(dāng)成熟,同時也就出現(xiàn)了很多開源的...
摘要:每個服務(wù)由多個進(jìn)程組成,為首的進(jìn)程名為。服務(wù)使用字節(jié)長的內(nèi)部事務(wù)標(biāo)識符,即時發(fā)生重疊后仍然繼續(xù)使用,這會導(dǎo)致問題,所以需要定期進(jìn)行操作。操作被認(rèn)為是緊跟操作后的操作。在涉及高比例插入刪除的表中,會造成索引膨脹,這時候可以重建索引。 簡介和認(rèn)知 發(fā)音 post-gres-q-l 服務(wù)(server) 一個操作系統(tǒng)中可以啟動多個postgres服務(wù)。每個服務(wù)由多個進(jìn)程組成,為首的進(jìn)程名為p...
摘要:某寶一年一度的集五?;顒痈浅蔀槊磕甑谋貍浠顒?。今年再來對福字做文章,演示下如何用的圖像處理功能,把一幅福字圖片轉(zhuǎn)出種不同的效果最圖像處理最常用的兩個模塊是和,這里我們選擇。輪廓福使用了自帶的圖像輪廓提取功能。 快過年了,各種互聯(lián)網(wǎng)產(chǎn)品都出來撒紅包。某寶一年一度的集五福(shua hou)活動更是成為每年的必備活動。雖然到最后每人大概也就分個兩塊錢,但作為一個全民話題,大多數(shù)人還是愿意...
摘要:這是坐標(biāo)百度,好像沒啥好研究的了,不過出于好奇還是想知道使用是如何做到把文字區(qū)域進(jìn)行框選的,所以接下來我們就看看如何在上使用實現(xiàn)圖片中的文字框選。一些探索 最近下了幾個OCR的App(比如白描),發(fā)現(xiàn)可以選中圖片中的文字行逐行轉(zhuǎn)成文字,覺得很有意思(當(dāng)然想用要花錢啦),想著自己研究一下實現(xiàn)原理,google之后,發(fā)現(xiàn)了兩個庫,一個是OpenCV,在機器視覺方面應(yīng)用廣泛,圖像分析必備利器。另一...
閱讀 1459·2023-01-11 13:20
閱讀 1814·2023-01-11 13:20
閱讀 1263·2023-01-11 13:20
閱讀 2006·2023-01-11 13:20
閱讀 4226·2023-01-11 13:20
閱讀 2879·2023-01-11 13:20
閱讀 1488·2023-01-11 13:20
閱讀 3807·2023-01-11 13:20