日韩小视频-日韩久久一区二区三区-日韩久久一级毛片-日韩久久久精品中文字幕-国产精品亚洲精品影院-国产精品亚洲欧美云霸高清

下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當前位置:軟件下載吧 > 技術開發 > 數據庫 > PostgreSQL HOT與PHOT有哪些區別

PostgreSQL HOT與PHOT有哪些區別

時間:2024-02-09 10:40作者:下載吧人氣:14

1、HOT概述

PostgreSQL中,由于其多版本的特性,當我們進行數據更新時,實際上并不是直接修改元數據,而是通過新插入一行數據來進行間接的更新。而當表上存在索引時,由于新插入了數據,那么索引必然也需要同步進行更新,這在索引較多的情況下,對于更新的性能影響必然很大。

為了解決這一問題,pg從8.3版本開始就引入了HOT(Heap Only Tuple)機制。其原理大致為,當更新的不是索引字段時,我們通過將舊元組指向新元組,而原先的索引不變,仍然指向舊元組,但是我們可以通過舊元組作為間接去訪問到新的元組,這樣就不用再去更新索引了。

2、HOT實現技術細節

要使用HOT進行更新,需要滿足兩個前提:

  • 新的元組和舊元組必須在同一個page中;
  • 索引字段不能進行更新。

當我們進行HOT更新時,首先是分別設置舊元組的t_informask2標志位為HEAP_HOT_UPDATED和新元組為HEAP_ONLY_TUPLE。

更新如下圖所示:

PostgreSQL HOT與PHOT有哪些區別

我們更新tuple1為tuple2,分別設置這兩行元組的t_informask2標志位,然后tuple1的ctid指向tuple2,而tuple2指向自己。

但是這樣存在一個明顯的問題,我們都知道pg會定期進行vacuum清理那些死元組,那么我們這里如果通過tuple1去訪問tuple2的話,tuple1這個死元組被清理了又該怎么辦呢?

PostgreSQL HOT與PHOT有哪些區別

所以pg會在合適的時機進行行指針的重定向,將舊元組的行指針指向新元組的行指針,這一過程稱為修剪。于是在修剪之后,我們通過HOT機制訪問數據便成了這樣:

1、通過索引元組找到舊元組的行指針1;

2、通過重定向的行指針1找到行指針2;

3、通過行指針2找到新元組tuple2。

這樣即使舊元組tuple1被清理掉也沒有影響了。

HOT對應的wal日志實現:

對于HOT的update操作,其wal日志中記錄的信息主要是由xl_heap_update結構存儲。

PostgreSQL HOT與PHOT有哪些區別

如果新的元組存儲在 block_id 為 0 的塊上,如果不是 XLOG_HEAP_HOT_UPDATE,那么舊的元組將會存儲在 block_id 為 1 的塊上。反之如果block_id 為 1 的塊沒有被使用,那么則認為是 XLOG_HEAP_HOT_UPDATE。

3、何時進行修剪

前面我們提到了,舊行的行指針會重定向到新行的行指針,這一過程稱之為修剪。那么什么時候會發生修剪呢?

一般來說,當我們執行select、update、insert、delete這些命令時均有可能觸發修剪,其觸發機制大致有兩種情況:

  • 上一次進行update時無法在本page找到足夠的空間;
  • 當前page上剩余空間小于fill-factor的值,最多小于10%

PostgreSQL HOT與PHOT有哪些區別

除此之外,當進行修剪時,還會選擇合適的時機進行死元組的清理,這一操作稱為碎片整理。碎片整理發生在當我們對元組進行檢索時發現空閑空間少于10%時,和修剪不同的是,碎片整理不會發生在insert時,因為該操作并不會檢索行。

相較于普通的vacuum操作,碎片清理并不涉及索引元組的清理,開銷相對于常規的清理要小很多,是通過PageRepairFragmentation函數來實現的。

這也是為什么HOT要求新舊元組需要在同一個page中,雖然從理論上來說我們可以將行指針的鏈表指向不同page,但是這樣我們便不能使用page-local的操作來進行碎片清理了。

4、HOT的不足

前面我們提到了HOT的前提條件之一就是:更新的列不能是索引列。需要注意,當更新的列是索引列時并不僅僅是會修改該列上的索引,整張表上所有的索引均會被修改。

例子:

創建測試表:

bill=# create table a(id int, c1 int, c2 int, c3 int);
CREATE TABLE
bill=# insert into a select generate_series(1,10), random()*100, random()*100, random()*100;
INSERT 0 10
bill=# create index idx_a_1 on a (id);
CREATE INDEX
bill=# create index idx_a_2 on a (c1);
CREATE INDEX
bill=# create index idx_a_3 on a (c2);
CREATE INDEX
標簽[db:關鍵字]

相關下載

查看所有評論+

網友評論

網友
您的評論需要經過審核才能顯示

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 午夜丝袜美腿福利视频在线看 | 欧美一级特黄视频 | 国产精品自在线天天看片 | 色偷偷女男人的天堂亚洲网 | 国产免费播放一区二区 | 国产精品不卡无毒在线观看 | 欧美另类videosgrstv变态 欧美另类高清xxxxx | 久久国产精品歌舞团 | 国产精品午夜性视频网站 | 精品99视频 | 欧美三级香港三级日本三级 | 在线播放亚洲视频 | 国产91九色刺激露脸对白 | 免费ab | 久操免费| 怡红院视频在线 | 免费精品久久久视频 | 中国美女乱淫免费看视频 | 韩国毛片免费看 | 欧美一级在线观看播放 | 欧美一级视频在线 | 加勒比色综合 | 玖草视频在线观看 | 美女扒开双腿让男人桶 | 国产毛片a精品毛 | 朝鲜美女免费一级毛片 | 日韩一区二区三区精品 | 欧美人体在线 | 久久影院在线观看 | 国产精品久久久久久网站 | 久久精品人人爽人人爽快 | 手机在线日韩高清理论片 | 在线a网站| 久久亚洲精品tv | 中国一级特黄视频 | 一区在线看 | 美国三级在线观看 | 99精品欧美一区二区三区美图 | 国产精品久久永久免费 | 日韩欧美视频在线一区二区 | 国产欧美综合一区二区 |