精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美精选在线播放| ww亚洲ww在线观看国产| 久久国产精品久久国产精品| 日韩高清一二三区| 天堂av中文在线观看| 国产精品美女久久久久久久 | 欧美福利精品| 国产欧美一级片| 亚洲尤物影院| 欧美精品性视频| 亚洲国产日韩一区无码精品久久久| 亚洲aⅴ网站| 欧美日韩国产麻豆| 懂色av粉嫩av蜜臀av| 日韩一级免费毛片| 麻豆91精品视频| 91禁外国网站| 国产探花在线播放| 怕怕欧美视频免费大全| 麻豆成人久久精品二区三区小说| 国产精品久久久爽爽爽麻豆色哟哟| 国产91色在线| 久久综合激情网| 日韩大片在线| 亚洲欧美综合精品久久成人| 欧美午夜精品一区二区| 精品美女一区| 色老汉一区二区三区| 黄黄视频在线观看| av大片在线观看| 91亚洲国产成人精品一区二三| 国产一区二区在线免费视频| 免费在线不卡视频| 国产精品v亚洲精品v日韩精品| 一区二区三区亚洲| 美女洗澡无遮挡| 欧美三级午夜理伦三级小说| 欧美一级二级三级蜜桃| 亚洲小视频网站| 韩国成人在线| 色猫猫国产区一区二在线视频| 黄色大片在线免费看| 国产在线高潮| 亚洲日穴在线视频| 一区二区三区四区免费视频| 国产youjizz在线| 国产丝袜在线精品| 日本一区二区三区www| 无码精品在线观看| 99久久国产综合色|国产精品| 高清视频一区| 欧美视频xxx| 成人免费黄色在线| 国产一区免费在线| 熟妇人妻av无码一区二区三区| 成人综合婷婷国产精品久久 | 久久久久久久香蕉网| 青娱乐免费在线视频| 欧美视频一区| 久久久噜久噜久久综合| 五月天婷婷网站| 国产视频一区免费看| 青青青爽久久午夜综合久久午夜| 色噜噜狠狠色综合网图区 | 国产精品精品国产色婷婷| 亚洲狠狠婷婷综合久久久| av在线三区| 中文字幕一区二区在线观看| 久久久成人精品一区二区三区| 国产激情在线| 午夜视频在线观看一区| 日韩av黄色网址| 日本黄色一区| 欧美精品777| 亚洲性图第一页| 青青一区二区| 在线观看国产精品淫| 波多野结衣久久久久| 亚洲午夜91| 国产91av在线| 亚洲无码精品国产| 国产成人午夜视频| 久久99精品久久久久久三级| 成年在线观看免费人视频| 亚洲欧洲精品天堂一级| 国产日韩亚洲欧美在线| 色资源二区在线视频| 欧美色偷偷大香| 四虎国产精品免费| 首页亚洲中字| 久久伊人色综合| 性无码专区无码| 蜜桃视频第一区免费观看| 亚洲自拍欧美色图| 男女网站在线观看| 亚洲欧洲综合另类在线 | 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲综合国产精品| 每日更新av在线播放| 1000部国产精品成人观看| 精品少妇人妻av免费久久洗澡| 日本欧美韩国| 精品国产免费一区二区三区四区 | 色综合狠狠操| 午夜欧美大片免费观看| 免费av一区二区| 最新av电影网站| 新67194成人永久网站| 成人国内精品久久久久一区| 天天射天天操天天干| 亚洲日本一区二区三区| 日韩a在线播放| 中文字幕av一区二区三区四区| 亚洲欧美日韩成人| 久草视频中文在线| 美女看a上一区| 蜜桃在线一区二区三区精品| 中文在线观看免费| 欧美三级日本三级少妇99| 久久国产劲爆∧v内射| 91嫩草亚洲精品| 国产精品av在线| 神马久久久久| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧洲日本精品| 九九热线有精品视频99| 韩国19禁主播vip福利视频| 一级aaaa毛片| 国产精品人成在线观看免费 | 神马影院我不卡| 美女av在线免费看| 精品捆绑美女sm三区| 中文字幕人妻一区二| 美女在线视频一区| 欧美主播一区二区三区美女 久久精品人| 欧美寡妇性猛交xxx免费| 欧美日韩激情在线| 国产又粗又猛又爽又黄的视频小说| 亚洲综合电影一区二区三区| 国产精品区免费视频| 美女日批视频在线观看| 欧美一区三区四区| av黄色免费在线观看| 欧美aaaaaa午夜精品| 日韩jizzz| 欧美123区| 中文字幕亚洲综合久久筱田步美 | 蜜乳av一区二区| 色一情一乱一伦一区二区三区 | 99国产精品99久久久久久粉嫩| 精品一区二区三区免费观看| 成人影片在线播放| 丝袜国产在线| 欧美变态口味重另类| 久久视频免费看| 成人高清免费观看| 奇米影视亚洲色图| 欧美日韩看看2015永久免费 | 日本少妇精品亚洲第一区| 久久影院模特热| 黄色三级网站在线观看| 亚洲不卡av一区二区三区| 小毛片在线观看| 鲁大师影院一区二区三区| 日韩国产精品一区二区| 99久久久国产精品免费调教网站| 中文字幕无线精品亚洲乱码一区 | 久草青青在线观看| 久久99性xxx老妇胖精品| 国产精品久久999| 欧美三级电影一区二区三区| 欧美一级淫片007| 国产午夜福利片| 久久影院午夜片一区| 久久久久久蜜桃一区二区| 亚洲最新av| 国产亚洲欧美另类一区二区三区| 欧美大胆性生话| 精品国内自产拍在线观看| 亚洲国产精品suv| 日韩欧美亚洲一二三区| 性欧美精品男男| 国产一区二区不卡| 自慰无码一区二区三区| 清纯唯美亚洲综合一区| 99国产高清| 伊人久久av| 精品国产欧美成人夜夜嗨| 亚洲女人18毛片水真多| 色婷婷综合激情| 亚洲色婷婷一区二区三区| 91麻豆精品在线观看| 日韩va在线观看| 亚洲免费大片| 一区二区三区欧美成人| 亚洲久久久久久| 夜夜春成人影院| 亚洲综合色av| 天天综合网站| 久久人人爽人人| 色网站在线看| 日韩激情av在线免费观看| 中文字幕在线观看1| 午夜久久久久久电影| 长河落日免费高清观看| 91在线视频播放| 又黄又爽又色的视频| 日韩精彩视频在线观看| 人人妻人人澡人人爽欧美一区双| 第一会所sis001亚洲| 国产伦精品一区二区三区免| 国产欧美自拍| 日韩av电影中文字幕| 国产乱码在线| 久久久999精品视频| 九九九伊在人线综合| 精品乱人伦小说| 国产精品无码一区二区桃花视频| 一本久道久久综合中文字幕| 久一区二区三区| 自拍偷拍国产精品| 国产aⅴ激情无码久久久无码| 成人午夜激情影院| 中文字幕久热精品视频在线| 伊人久久一区二区| 日韩欧美亚洲国产一区| 亚洲天堂日韩av| 亚洲一区二区三区四区在线观看 | 国产精品96久久久久久又黄又硬 | 在线免费观看日本欧美爱情大片| 欧美日韩日本网| 午夜欧美视频| 欧美一二三区| 欧美黑人巨大videos精品| 亚洲综合色av| 欧美日韩黄色| 18成人在线| 免费一级欧美片在线观看网站| 国产在线999| 成人在线观看免费播放| 国产福利精品视频| 四虎4545www精品视频| 91精品国产91久久久久久不卡| 青草影视电视剧免费播放在线观看| 日韩在线观看高清| 麻豆传媒在线观看| 久久亚洲精品视频| 成年女人免费视频| 欧美激情自拍| 日韩a级黄色片| 欧美婷婷在线| 自拍亚洲一区欧美另类| 四虎4hu永久免费入口| 日韩精品一区二区三区免费视频| 亚洲字幕一区二区| 999在线精品| 国产伦精品一区二区三毛| 哺乳一区二区三区中文视频| 国产高清一区视频| 久久影视三级福利片| 国语精品中文字幕| 久久91成人| 在线免费一区| 大香伊人久久精品一区二区| 国产中文一区二区| 久久av电影| 中文字幕精品—区二区日日骚| 天天插综合网| 蜜臀精品一区二区| 免费欧美在线| 亚洲免费黄色录像| 国产电影一区二区三区| 尤物网站在线观看| 国产亚洲欧美日韩俺去了| 人成免费在线视频| 亚洲精品中文字幕乱码三区 | 亚洲男女在线观看| 久久福利影院| 国产1区2区3区中文字幕| 欧美激情视频一区二区三区免费| www.18av.com| 91精品国产乱码久久久久久久| 国产欧美精品aaaaaa片| 一本色道久久综合| 国产福利影院在线观看| 国产一区久久久| 自拍视频一区二区| 国产精品久久精品日日| 久久高清无码视频| 欧美在线免费播放| 国产黄色片网站| 亚洲免费电影一区| a天堂中文在线官网在线| 欧美做爰性生交视频| 欧洲精品一区色| 午夜国产欧美理论在线播放| 欧美日韩第二页| 国产美女娇喘av呻吟久久| 欧美特黄一区二区三区| 亚洲欧美日韩电影| 少妇高潮av久久久久久| 日韩一区二区三免费高清| 免费在线黄色电影| 欧美激情免费观看| 91黄色在线视频| 久久aⅴ国产欧美74aaa| 香蕉视频xxx| 久久久www免费人成精品| 全网免费在线播放视频入口| 欧美日韩免费在线| 精品国产乱码久久久久久蜜臀网站| 亚洲视频在线免费观看| 污片在线免费观看| 国产精品亚洲网站| 久草成人在线| 国产精品无码人妻一区二区在线| 激情综合色综合久久综合| 久久精品无码一区| 亚洲成人免费视频| 中文字幕人妻精品一区| 日韩精品免费综合视频在线播放| 黄av在线免费观看| 日本久久91av| 激情小说亚洲图片| 国产精品videossex国产高清| 蜜臀久久99精品久久久画质超高清| 国产又粗又长又爽| 亚洲第一狼人社区| 亚洲爱情岛论坛永久| 久久中文字幕一区| 色狠狠一区二区三区| 天天久久人人| 亚洲伊人精品酒店| 久久综合中文色婷婷| 在线高清一区| 国产精品亚洲一区二区无码| 亚洲免费色视频| 国产美女永久免费| 久久精品视频播放| 久久久加勒比| 一本色道久久99精品综合| 视频一区国产视频| 亚洲最大成人综合网| 在线观看一区二区视频| 国产精品麻豆一区二区三区| 国产精品video| 欧美一级精品片在线看| 一级在线免费视频| 中文字幕一区二区不卡 | 日韩综合小视频| 谁有免费的黄色网址| 在线看国产一区| 99re在线视频| 成人在线视频网| 最新国产精品| 国产精品久久久久久亚洲色| 欧美日韩国产色视频| 九一国产在线| 国产精品久久电影观看| 国产高清一区| 成人欧美精品一区二区| 午夜精品爽啪视频| 欧美女子与性| 国产精品嫩草影院一区二区| 欧美成人自拍| 亚洲少妇一区二区三区| 亚洲成av人片一区二区梦乃| 视频二区在线| 成人国产在线激情| 国产精品激情| 一区二区精品免费| 9191成人精品久久| heyzo高清在线| 日本高清不卡一区二区三| 免费观看在线综合色| 亚洲精品免费网站| 日韩精品一区国产| 无码人妻精品一区二区三区在线| 国产日韩成人精品| 国产视频一区二区三| 欧美一级淫片丝袜脚交| 久久社区一区| 偷偷色噜狠狠狠狠的777米奇| 在线看不卡av| 欧美韩日亚洲| 亚洲色图自拍| www.av精品| 一级aaaa毛片| 26uuu久久噜噜噜噜| 国产大片一区| 瑟瑟视频在线观看| 日韩一区二区三区四区| 日韩免费电影| 男女激情免费视频| 中文字幕不卡一区| 欧美自拍偷拍一区二区| 国产欧美亚洲视频| 在线视频精品| 久久精品波多野结衣| 伊人一区二区三区久久精品 |