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