postgresql create index concurrently過程描述
PostgreSQL支援在不鎖定寫入的情況下建立索引。透過指定的concurrently選項來呼叫此方法create index。使用
此選項時,PostgreSQL必須對錶進行兩次掃描,此外,它還必須等待所有可能修改或使用索引終止的現有事務。
因此,此方法比標準索引構建需要更多的總工作量,並且需要花費更長的時間才能完成。但是,由於它允許在建立索引的同時
繼續進行正常操作,因此該方法對於在生產環境中新增新索引很有用。當然,索引建立所帶來的 額外CPU和I / O負載可能會減慢其他操作的速度。
在併發索引構建中,實際上是透過一個事務將索引輸入到系統目錄中,然後在另外兩個事務中進行兩次表掃描。在每個表掃描
之前,索引構建必須等待修改該表的現有事務終止。在第二次掃描之後,索引構建必須等待在第二次 掃描之前終止具有快照的所有事務,如果涉及的索引是部分索引或其他索引,則包括在其他表上的併發索引構建的任何階段
使用的事務。具有不是簡單列引用的列。然後,最後可以將索引標記為可以使用了,
並且CREATE INDEX命令終止。但是,即使那樣,索引也可能無法立即用於查詢:在最壞的情況下,只要存在早於索引構建
開始的事務,就不能使用該索引。
使用create index concurrently建立索引,主要分為三個階段,掃描兩次TABLE。
create index concurrently idx_b_2 on b (id);
階段如下:
1、開啟事務1,拿到當前snapshot1。
2、掃描B表前,等待所有修改過B表(寫入、刪除、更新)的事務結束。
3、掃描B表,並建立索引。
4、結束事務1。
5、開啟事務2,拿到當前snapshot2。
6、再次掃描B表前,等待所有修改過B表(寫入、刪除、更新)的事務結束。
7、在snapshot2之後啟動的事務對B表執行的DML,會修改這個idx_b_2的索引。
8、再次掃描B表,更新索引。(從TUPLE中可以拿到版本號,在snapshot1到snapshot2之間變更的記錄,將其合併到索引)
9、上一步更新索引結束後,等待事務2之前開啟的持有snapshot的事務結束。
10、結束索引建立。索引可見。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2766634/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- create index .. onlineIndex
- PostgreSQL DBA(37) - PG 12 REINDEX CONCURRENTLYSQLIndex
- hive orc表'orc.create.index'='true'與'orc.create.index'='false'HiveIndexFalse
- PostgreSQL:INDEXSQLIndex
- PostgreSQL 原始碼解讀(132)- MVCC#16(vacuum過程-lazy_vacuum_index函式#1)SQL原始碼MVCC#Index函式
- PostgreSQL 原始碼解讀(133)- MVCC#17(vacuum過程-lazy_vacuum_index函式#2)SQL原始碼MVCC#Index函式
- 請描述下application cache的更新過程?APP
- create index ORA-00376 處理方法Index
- PostgreSQL DBA(59) - Index(Bloom)SQLIndexOOM
- PostgreSQL DBA(52) - Index(RUM)SQLIndex
- PostgreSQL DBA(47) - Index(Btree)SQLIndex
- PostgreSQL DBA(48) - Index(GiST)SQLIndex
- PostgreSQL DBA(51) - Index(GIN)SQLIndex
- PostgreSQL DBA(43) - Index(Hash)SQLIndex
- PostgreSQL DBA(53) - Index(BRIN)SQLIndex
- 【INDEX】Postgresql索引介紹IndexSQL索引
- 實踐001-elasticsearch的index、create、updateElasticsearchIndex
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- 【讀書筆記】Postgresql清理過程筆記SQL
- PostgreSQL DBA(41) - PG Index PropertiesSQLIndex
- PostgreSQL DBA(119) - pgAdmin(LIMIT:Index Scan vs Bitmap Index Scan)SQLMITIndex
- CentOS7下PostgreSQL安裝過程CentOSSQL
- PostgreSQL DBA(170) - pgAdmin(Queries For Index Maintenance)SQLIndexAINaN
- PostgreSQL DBA(49) - Index(SP-GiST)SQLIndex
- PostgreSQL DBA(165) - pgAdmin(Create Function選項)SQLFunction
- PostgreSQL的insert語句執行過程分析SQL
- PostgreSQL DBA(177) - Serializability Isolation(Index vs NonIndex)SQLIndex
- Oracle vs PostgreSQL Develop(31) - Index Only ScanOracleSQLdevIndex
- 第 16 課 PostgreSQL查詢過程原始碼分析SQL原始碼
- postgresql安裝過程中核心資源的配置SQL
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- 描述下什麼是域名解析?簡述它的基本過程
- PostgreSQL 原始碼解讀(126)- MVCC#10(vacuum過程)SQL原始碼MVCC#
- 什麼是詞法分析?請描述下js詞法分析的過程?詞法分析JS
- PostgreSQL啟動恢復過程中日誌源的切換SQL
- PostgreSQL如何檢視page、index的詳細資訊SQLIndex
- PostgreSQL DBA(139) - PG 12(B-tree index improvement 1#)SQLIndex