精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PostgreSQL 中的并發創建索引

數據庫 PostgreSQL
Reindex Concurrently 的主要實現邏輯,首先會根據傳入的 relationOid,找到所有需要進行 Reindex 的 indexId,并且跳過一些不能進行 Reindex 的索引,例如系統 catalog 表不支持 Reindex。

一、初體驗 Create Index Concurrently

在 PostgreSQL 11 之前,創建索引和表數據更新是互斥的,也就是說創建索引時會持有一把鎖,這時候任何對表數據的增加、更新、刪除操作,都將等待索引創建完成才能繼續執行。

如下面的例子:

  1. 創建示例表
-- 創建測試表,并向其中插入 500w 行隨機字符串數據

CREATE TABLE articles (
id SERIAL8 NOT NULL PRIMARY KEY,
a text,
b text,
c text
);

INSERT INTO articles(a, b, c)
SELECT
md5(random()::text),
md5(random()::text),
md5(random()::text)
from (
SELECT * FROM generate_series(1,5000000) AS id
) AS x;
  1. 打開一個 psql 客戶端,執行創建索引操作
ubuntu=# create index idx_a on articles (a);
  1. 索引創建時打開另一個 psql 客戶端,并向表中插入數據,此時另一個事務已經持有表鎖了,所以會一直等待事務結束之后才會繼續執行
ubuntu=# insert into articles(a, b, c) values ('1', '2', '3');

可以在事務執行期間,通過 pg_locks 表查看事務持有的鎖,可以看到創建索引的操作占據了 ShareLock(5 號鎖),插入操作需要獲取 RowExclusiveLock 鎖,而這兩者是互斥的。

ubuntu=# select * from pg_locks where relation = 'articles'::regclass;
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted | fastpath |
waitstart
----------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+---------+------------------+---------+----------+-
-----------------------------
relation | 2638325 | 2638341 | | | | | | | | 3/22624 | 1236742 | RowExclusiveLock | f | f |
2023-01-13 14:08:32.54543+08
relation | 2638325 | 2638341 | | | | | | | | 4/209 | 1236951 | ShareLock | t | f |
relation | 2638325 | 2638341 | | | | | | | | 6/20 | 1237182 | ShareLock | t | f |
(3 rows)

索引創建和表更新操作的互斥,帶來一個嚴重的后果,那便是如果表數據量較大,創建索引的時間可能很長,如果長時間鎖表的話,會導致表無法更新,可能會對在線業務產生很大的影響。

于是 PostgreSQL 在 11 版本中支持了并發創建索引,即 CREATE INDEX CONCURRENTLY,其主要功能是在創建索引的時候,不阻塞表數據的更新。

還是看上面的示例,只需要將第一個事務的 sql 修改為 create index CONCURRENTLY idx_a on articles (a);,那么其他事務的表數據更新操作將會正常執行,不會被阻塞。

然后再看其持有的鎖,可以看到已經變成了 ShareUpdateExclusiveLock(4 號鎖):

ubuntu=# select * from pg_locks where relation = 'articles'::regclass;
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted | fas
tpath | waitstart
----------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+---------+--------------------------+---------+----
------+-----------
relation | 2638325 | 2638341 | | | | | | | | 4/214 | 1236951 | ShareUpdateExclusiveLock | t | f
|
(1 row)

在并發創建索引的時候,如果遇到了不符預期的錯誤,或者手動取消,那么這個索引將會留在表中,但是被標識為 INVALID,表示這個索引不可用,也就是說將不會使用這個索引進行索引掃描。

后續可以手動將其 DROP 掉,然后重新建立索引,也可以執行 REINDEX CONCURRENTLY 重建索引。

ubuntu=# \d articles
Table "public.articles"
Column | Type | Collation | Nullable | Default
--------+--------+-----------+----------+--------------------------------------
id | bigint | | not null | nextval('articles_id_seq'::regclass)
a | text | | |
b | text | | |
c | text | | |
Indexes:
"articles_pkey" PRIMARY KEY, btree (id)
"idx_body" btree (a) INVALID

注意:CREATE INDEX CONCURRENTLY 不能在事務塊中執行,也就是說我們不能顯式的 begin 開啟事務然后執行 CREATE INDEX CONCURRENTLY。

二、CREATE INDEX CONCURRENTLY 的三個步驟

主要的代碼位置在 https://github.com/postgres/postgres/blob/master/src/backend/commands/indexcmds.c#L488

DefineIndex 方法中主要是處理索引創建的邏輯,方法前面部分主要是做一系列校驗和參數初始化等,然后調用 index_create 方法將索引的元信息存儲到 pg_index、pg_class 等表中。

并且如果判斷到不是 concurrently 創建索引的話,這里會直接返回,也就是說這之后的邏輯都是處理 CONCURRENTLY 并發索引創建的部分。

if (!concurrent)
{
/* Close the heap and we're done, in the non-concurrent case */
table_close(rel, NoLock);

/* If this is the top-level index, we're done. */
if (!OidIsValid(parentIndexId))
pgstat_progress_end_command();

return address;
}

接著上面的代碼往下看,就是 postgres 的并發創建索引邏輯,主要分為了三個步驟,這部分代碼的注釋也有一些相應的說明。

  1. 開啟一個事務,通過 index_create 方法,將索引的元數據信息存儲到 pg_class、pg_index 表中,并且標識索引的 indisready 和 indisvalid 屬性為 false,表示目前索引沒有 ready 并且不可用_;_提交事務,并開啟一個新的事務進入下一階段。

此階段相當于 DefineIndex 的前一部分,和正常的 create index 的邏輯是相同的。

  1. 1. 進入此階段時,需要等待系統中其他正在寫數據的事務提交,因為必須讓新索引的定義對其他所有的事務都可見,保證 HOT 更新滿足表的索引定義,調用 WaitForLockers 函數進行等待 2. 通過 index_concurrently_build 創建索引,同時持有 4 號鎖,不阻塞表的增/刪/改操作;獲取一個 MVCC 快照,將此快照下可見的元組寫入到索引中;此時如果有其他的事務有新的寫入,將不會插入到索引中,只是保證 HOT 滿足索引的定義;提交事務,將索引設置為 isready,后續如果有新的數據插入,將會維護這個索引,但是索引仍然是 invalid,不能用于索引掃描。并再開啟一個新的事務,進入到下一階段。
  2. 1. 又要等待當前所有寫事務都提交,保證所有的事務都能看到新索引的定義 2. 在第二階段的執行過程中,有可能又有新的元組插入到表中,所以需要再獲取一個新的 MVCC 快照,并將新的元組插入到索引中,調用函數 validate_index 3. 此時還需要一次等待,將指定 xmin 的之前的事務提交,調用函數 WaitForOlderSnapshots 4. 最后將索引置為 valid,后續其他事務便可以使用該索引進行查詢了

三、Reindex Concurrently

REINDEX 是一個更加復雜的命令,PostgreSQL 中也是支持對 REINDEX 進行 CONCURRENTLY 操作的,了解了 CREATE INDEX 之后,我們再來看看 Reindex Concurrently 是如何在 PostgreSQL 上執行的。

ExecReindex

PostgreSQL 的 REINDEX 的主要邏輯在方法 ExecReindex 中,對 Reindex 的處理分為了三種情況:

  • REINDEX_OBJECT_INDEX(針對索引)
  • REINDEX_OBJECT_TABLE(針對表)
  • REINDEX_OBJECT_SCHEMA、REINDEX_OBJECT_SYSTEM、REINDEX_OBJECT_DATABASE(針對 schema、系統表、整個庫)

圖片

ReindexRelationConcurrently

這個方法是 Reindex Concurrently 的主要實現邏輯,首先會根據傳入的 relationOid,找到所有需要進行 Reindex 的 indexId,并且跳過一些不能進行 Reindex 的索引,例如系統 catalog 表不支持 Reindex。

主要的代碼位置:https://github.com/greenplum-db/gpdb/blob/main/src/backend/commands/indexcmds.c#L3575

拿到需要進行 Reindex 的索引 Oid 之后,然后進入 Reindex Concurrently 的六個階段:

  • 創建新的索引,創建后表中有一個臨時的新的索引,名稱以 idx_ccnew 開頭
  • build 新創建的索引,即掃描全表數據,構建索引的內容
  • validate 新創建的索引,將前一個階段新插入的數據加入到索引中,這個和 create index concurrently 類似
  • 交換索引,將新創建的索引和它對應的需要 reindex 的索引進行交換,舊的索引標識為 invalid
  • 將舊的索引設置為 dead 狀態,即 indislive、indisready、indisvalid 均為 false
  • 最后將舊的索引 drop 掉

ps. 在 Postgres 的官方文檔中,也有對 Create Index/Reindex Concurrently 的描述,只是沒有深入到代碼細節之中,可以參考看下這兩個步驟的執行步驟。

??https://www.postgresql.org/docs/current/sql-createindex.htmlhttps://www.postgresql.org/docs/current/sql-reindex.html??

責任編輯:武曉燕 來源: roseduan寫字的地方
相關推薦

2024-07-08 10:48:51

2011-07-20 09:16:02

MongoDB索引稀疏索引

2024-01-02 09:53:36

PostgreSQL數據庫創建和管理表

2010-10-26 16:33:54

創建Oracle索引

2011-10-13 09:44:49

MySQL

2011-05-30 10:36:49

MySQL

2010-05-21 10:01:11

MySQL數據庫

2024-04-03 09:12:03

PostgreSQL索引數據庫

2010-09-29 13:52:33

PostgreSQL

2023-11-30 16:29:16

PostgreSQL數據庫Kubernetes

2012-12-04 10:29:47

PostgreSQL索引

2017-09-22 09:20:06

數據庫索引

2023-05-30 11:52:11

索引冗余索引

2024-04-16 09:53:56

PostgreSQL數據庫優化索引

2009-11-16 09:05:47

PostgreSQLInnoDB多版本并發控制

2025-05-22 09:01:28

2009-11-19 15:32:50

Oracle索引

2010-11-16 10:21:25

Oracle創建表

2010-05-11 10:47:13

MySQL索引類型

2011-03-17 13:33:04

索引可選項
點贊
收藏

51CTO技術棧公眾號

最新在线黄色网址| 无码aⅴ精品一区二区三区浪潮| 国产精品-色哟哟| 欧美日韩国产在线一区| 亚洲免费精彩视频| 一本久道综合色婷婷五月| 日本在线免费中文字幕| 国产一区二区伦理| 欧亚精品在线观看| 免费成人深夜夜行网站| 精品少妇一区| 欧美图区在线视频| 免费看黄在线看| 男人的天堂在线视频免费观看 | 日韩aaaa| 亚洲国产欧美日韩精品| jizz欧美性11| av中文资源在线资源免费观看| 中文av一区二区| 好吊色欧美一区二区三区视频| 蜜臀99久久精品久久久久小说| 午夜精品av| 最近2019中文字幕在线高清| 制服丝袜第一页在线观看| 欧美成人黄色| 日本电影亚洲天堂一区| 精品丰满人妻无套内射| 蜜桃视频在线观看www社区| 91视频精品在这里| 亚洲一区精品电影| 亚洲性在线观看| 久久裸体视频| 午夜精品久久久久久久99热浪潮| 青青操在线视频观看| 久久成人av| 亚洲激情在线观看| 国产a√精品区二区三区四区| 国产毛片精品久久| 日韩欧美综合在线视频| 久艹视频在线免费观看| 欧美日韩经典丝袜| 亚洲三级理论片| 一区二区三区av在线| 久久精品蜜桃| 久久久噜噜噜久久人人看| 国产精品免费一区二区三区观看| 国产精品视频在线观看免费| 琪琪一区二区三区| 国产成人综合精品| 亚洲图片欧美日韩| 日韩成人精品在线观看| 日韩美女中文字幕| 波多野结衣 久久| 老妇喷水一区二区三区| 日本欧美国产在线| 国产一级一级国产| 久久亚洲二区| 国产精品劲爆视频| 天天天天天天天干| 美女任你摸久久| 成人国产亚洲精品a区天堂华泰 | 欧美mv和日韩mv国产网站| 善良的小姨在线| 精品视频在线观看免费观看| 日韩午夜在线观看| 女同性αv亚洲女同志| 无人区乱码一区二区三区| 欧美videossexotv100| 中文字幕99页| 小嫩嫩12欧美| 亚洲性夜色噜噜噜7777| 亚洲女同二女同志奶水| 久久久老熟女一区二区三区91| av免费在线网站| 亚洲主播在线观看| 欧美刺激性大交免费视频| 国产精品夜夜夜爽阿娇| 亚洲字幕久久| 性色av香蕉一区二区| 黄瓜视频在线免费观看| 日本最新不卡在线| 91免费人成网站在线观看18| 亚洲国产精品久久久久久久| 91在线免费视频观看| 成人观看高清在线观看免费| 黄色av小说在线观看| 久久久欧美精品sm网站| 一区二区三区四区国产| 精精国产xxxx视频在线中文版| 五月婷婷久久综合| 日韩一级理论片| 视频成人永久免费视频| 亚洲精品国产成人| 亚洲AV成人无码网站天堂久久| 欧美精品大片| 欧美在线亚洲一区| 国产精品久久综合青草亚洲AV| 国产99久久久精品| 日韩电影在线播放| 在线播放免费av| 色综合久久99| 91av免费观看| 欧美综合视频| 国内精品视频久久| 91精品视频免费在线观看| 波多野洁衣一区| 一区二区冒白浆视频| 水蜜桃在线视频| 91精品国产福利在线观看| 人妻熟女aⅴ一区二区三区汇编| 99久久99视频只有精品| 国产69久久精品成人| 国产99视频在线| 国产丝袜在线精品| 日本中文字幕在线视频观看 | 亚洲成av人在线观看| 欧美日韩怡红院| 97超碰成人| 久久精品国产欧美激情| 亚洲 欧美 中文字幕| 成人免费视频caoporn| 丝袜美腿玉足3d专区一区| 热三久草你在线| 精品剧情在线观看| 青青青手机在线视频| 老司机精品视频网站| 国精产品99永久一区一区| 黄色网址视频在线观看| 欧美视频一二三区| 国产精品成人一区二区三区电影毛片 | 久久精品国产**网站演员| 久久66热这里只有精品| 日本在线视频中文有码| 欧美日韩国产经典色站一区二区三区 | 亚洲国产一二三精品无码| 欧美日韩女优| 国产亚洲激情在线| 日本视频网站在线观看| 91美女在线视频| 黄色网页免费在线观看| 大奶一区二区三区| 九九热这里只有精品6| 97人妻人人澡人人爽人人精品 | 欧美日韩一区二区三区电影| 99久久婷婷国产综合精品首页| 日韩电影第一页| 天天综合网入口| 99精品视频免费在线观看| 成人一级生活片| 岛国av一区| 欧美激情综合亚洲一二区| 性中国xxx极品hd| 亚洲猫色日本管| 四虎国产精品免费| 在线播放不卡| 国产在线精品一区二区三区》| 国产99在线| 国产视频亚洲精品| 一级黄色在线视频| 中文字幕欧美三区| 91国内在线播放| 亚洲精品97| 超碰97网站| av不卡高清| 亚洲精品自产拍| 久久久久亚洲视频| 一区二区中文字幕在线| 亚洲欧美日韩网站| 伊人成年综合电影网| 精品国产乱码久久久久| 欧美黑人粗大| 久久久极品av| 日韩在线观看视频网站| 精品欧美aⅴ在线网站| 美女爆乳18禁www久久久久久| 免费看欧美美女黄的网站| 精品少妇人妻av一区二区| 亚洲1区在线| 2019中文字幕免费视频| 2017亚洲天堂1024| 日韩欧美一级在线播放| 黄网在线观看视频| 国产精品无码永久免费888| 国产资源中文字幕| 亚洲美女视频在线免费观看| 日韩精品欧美专区| 亚洲超碰在线观看| 日本sm极度另类视频| 日本电影在线观看网站| 欧美zozo另类异族| 亚洲精品无码久久久久| 亚洲免费观看高清完整版在线| 中文字幕精品久久久| 免费观看在线色综合| 国产91在线亚洲| 亚瑟一区二区三区四区| 亚洲一区二区三区毛片| a日韩av网址| 欧美成人免费小视频| 你懂的视频在线| 欧美成人激情免费网| 中文字幕av第一页| 亚洲午夜一区二区三区| 影音先锋男人在线| caoporm超碰国产精品| 久久这里只精品| 国产欧美激情| 肉大捧一出免费观看网站在线播放| 伊甸园亚洲一区| 99re国产视频| 草民电影神马电影一区二区| 久久久亚洲精选| 免费av毛片在线看| 国产一区二区三区四区福利| 日韩在线观看视频网站| 日韩视频一区二区| 亚洲国产无线乱码在线观看| 精品福利在线看| 麻豆国产尤物av尤物在线观看 | 国产麻豆一精品一av一免费 | 123成人网| 9.1国产丝袜在线观看| 成人国产免费电影| 中文字幕日韩在线观看| 青青免费在线视频| 亚洲第一二三四五区| www.蜜桃av.com| 欧美精品自拍偷拍动漫精品| 99久久久无码国产精品免费蜜柚 | 91视频观看免费| 国产情侣久久久久aⅴ免费| 国产一区二区三区在线观看免费 | 从欧美一区二区三区| 五月激情婷婷在线| 青青草97国产精品免费观看 | 亚洲精品男人的天堂| 亚洲国产欧美在线人成| 青娱乐国产盛宴| 亚洲欧美国产三级| 三上悠亚在线观看视频| 国产精品少妇自拍| 色屁屁草草影院ccyy.com| 久久婷婷一区二区三区| 免费成人蒂法网站| 97se亚洲国产综合自在线不卡 | 国产特黄一级片| 欧美精品精品一区| 国产精品九九九九| 正在播放亚洲一区| 国产视频手机在线| 日韩欧美一区二区久久婷婷| 性生交大片免费看女人按摩| 精品日韩在线一区| 韩国av永久免费| 亚洲国产精品字幕| 视频一区二区三区国产| 亚洲欧美日韩高清| 国产黄色免费在线观看| 深夜福利亚洲导航| 黄色网址免费在线观看| 萌白酱国产一区二区| 国产探花在线观看| 91高清视频在线免费观看| 亚洲黄色免费看| 国产精品久久久av| 日韩午夜电影免费看| 91精品网站| 超碰在线成人| 蜜桃91精品入口| 日韩欧美中字| 老司机午夜网站| 宅男噜噜噜66国产日韩在线观看| 亚洲国产精品久久久久爰色欲| 日日摸夜夜添夜夜添亚洲女人| 亚洲人辣妹窥探嘘嘘| 国产在线播放一区二区三区| 黄色av电影网站| 久久免费国产精品| 美女福利视频网| 亚洲成人tv网| 国产又粗又猛又爽又| 日韩欧美中文一区| 天堂a中文在线| 日韩一区二区三区在线播放| 日韩电影免费观看| 日韩av手机在线观看| 欧美91在线|欧美| 国产麻豆乱码精品一区二区三区| 免费一区二区三区视频导航| 曰韩不卡视频| 夜久久久久久| 国产三级生活片| xnxx国产精品| 欧美人禽zoz0强交| 91久久精品一区二区二区| 99热这里只有精品9| 亚洲美女激情视频| av在线麻豆| 国产精品99久久久久久久久久久久| 亚洲成a人片777777久久| 久久久99国产精品免费| 亚洲成人精品| 日本www高清视频| 成人在线综合网| 亚洲女人久久久| 色久综合一二码| 男人天堂综合网| 中文字幕精品av| 精品众筹模特私拍视频| 国产欧美婷婷中文| 亚洲精品国模| 久久99久久久久久| 国内精品久久久久影院一蜜桃| 国产网站无遮挡| 亚洲精品免费在线播放| 日批视频免费观看| 日韩精品免费综合视频在线播放| a视频在线播放| 国产欧美一区二区三区在线看 | 亚洲黄色小说图片| 欧美成人性福生活免费看| 欧美成人hd| 国产女人18毛片水18精品| 亚洲人成精品久久久| 国产日本在线播放| 国产传媒一区在线| 中文字幕无码日韩专区免费| 精品视频在线看| 99免在线观看免费视频高清| 日本精品久久中文字幕佐佐木 | 偷拍视频一区二区| 久久精选视频| 短视频在线观看| 欧美日韩国产综合新一区| 欧日韩在线视频| 欧美极品少妇xxxxⅹ免费视频| 亚洲综合影院| 超级碰在线观看| 国产成人啪午夜精品网站男同| 亚洲色偷偷综合亚洲av伊人| 欧美性感一区二区三区| 电影在线高清| 国产精品一区久久| 日韩电影免费网站| 香港日本韩国三级网站| 欧美国产一区在线| 久久久黄色大片| 一道本无吗dⅴd在线播放一区 | 91国产免费观看| 久久天堂电影| 国产精品电影在线观看| 日韩大片在线播放| 手机免费av片| 亚洲日本一区二区三区| jizz国产视频| 久久久久成人网| 天堂俺去俺来也www久久婷婷| 国产97在线 | 亚洲| 久久久久88色偷偷免费| 免费一级a毛片| 欧美超级免费视 在线| 亚洲性视频在线| 777精品久无码人妻蜜桃| 久久综合五月天婷婷伊人| 国产精品免费无遮挡无码永久视频| 国产亚洲欧美日韩一区二区| 久久久久毛片| 日韩视频 中文字幕| www.日本不卡| 波多野结衣人妻| 不卡av日日日| 国产欧美啪啪| 男人的天堂日韩| 1024国产精品| 天天操天天干天天插| 日韩av男人的天堂| 久久精品国产www456c0m| 国产精品91av| 色哟哟精品一区| 岛国中文字幕在线| 久久99精品久久久久久久青青日本 | 久草青青在线观看| 中文字幕av资源一区| 国产激情久久久久久熟女老人av| 久久久欧美精品| 成人免费在线观看av| 中文字幕永久免费| 91官网在线观看| 97caopor国产在线视频| 免费久久久一本精品久久区| 韩国av一区二区| 中文字幕亚洲精品一区| 精品国产欧美一区二区五十路 | 精品一区二区三区视频在线观看| 麻豆亚洲av熟女国产一区二| 国产亚洲欧美视频| 精品久久ai电影| 捷克做爰xxxⅹ性视频| 一本色道a无线码一区v| a毛片在线看免费观看|