前言:

我们知道Oracle 可以通过create index online 在线创建索引,而不影响其他会话修改数据,但Oracle 实际在online 创建索引的最后一步,实际还是需要进行锁升级,申请表级的S锁,因此,最后还是有可能堵塞其他会话。而KingbaseES 的两阶段创建索引的机制,则不会对增删改操作有任何影响。以下我们通过观察创建索引过程中会话持有锁及等待的情况,来看下整个过程。

一、KingbaseES 非 Concurrently 创建索引

过程及锁申请如下:

可以看到,正常创建索引的过程需要一直持有 ShareLock 锁,而 ShareLock 与 RowExclusiveLock 冲突,增删改操作无法进行。

二、KingbaseES 以 Concurrently 创建索引

过程及锁持有如下:

注意点:

  1. 会话A 模拟了两次事务(这两次事务间隔时间很长),主要是为了验证 concurrently 创建索引的两次读取数据的过程。
  2. 会话A 在结束第1个事务后,会话B 才能开始扫描表(所有create index 开始时活动事务结束后),并建立索引。
  3. 会话 A 在结束第1 个事务后,立即开启事务2 , 此时 会话B 才开始建索引,也就是先于 B (在会话B 需要取得snapshot2前),这样会话B 又得等待。
  4. 可以看到,在创建过程中会话B 的virtualtransaction 会变动(两个值)

在并发索引构建中,需要在两个虚拟事务中发生两次表扫描。在每一次表扫描之前,索引构建必须等待已经修改了 表的现有事务终止。在第二次扫描之后,索引构建必须等待任何持有早于第二次扫描的快照的事务终止。然后该索引最终能被标记为准备好使用,并且CREATE INDEX命令终止。 不过即便那样,该索引也不是立刻可以用于查询:在最坏的情况下,只要早于索引构建开始时存在的事务存在,该索引就无法使用。

具体阶段如下:

  1. 开启 virtualtransaction1,拿到当前snapshot1。
  2. 扫描A表前,等待所有snapshot1前所有修改过A表的事务结束。
  3. 扫描A表,并建立索引。
  4. 结束 virtualtransaction1。
  5. 开启 virtualtransaction2,拿到当前 snapshot2。
  6. 再次扫描A表前,等待snapshot2前所有修改过A表的事务结束。
  7. 在snapshot2之后启动的事务对A表执行的DML,会修改索引。
  8. 再次扫描A 表,根据xmin or xmax ,在snapshot1到snapshot2之间变更的记录,合并到索引。
  9. 上一步更新索引结束后,等待任何持有早于第二次扫描的快照的事务结束(比如某repeatable read事务读取了该表 )。
  10. 结束索引创建。索引可见。

KingbaseES Create Index Concurrently 过程探究的更多相关文章

  1. PostgreSQL的 create index concurrently

    对于PostgreSQL的 "create index concurrently". 我个人认为其中存在一个bug. 我的验证过程如下: 我有两个表,tab01和 tab02,这两 ...

  2. linux之SQL语句简明教程---CREATE INDEX

    索引 (Index) 可以帮助我们从表格中快速地找到需要的资料.举例来说,假设我们要在一本园艺书中找如何种植青椒的讯息.若这本书没有索引的话,那我们是必须要从头开始读,直到我们找到有关种直青椒的地方为 ...

  3. Android UI测量、布局、绘制过程探究

    在上一篇博客<Android中Activity启动过程探究>中,已经从ActivityThread.main()开始,一路摸索到ViewRootImpl.performTraversals ...

  4. elasticsearch index 之 create index(二)

    创建索引需要创建索引并且更新集群index matedata,这一过程在MetaDataCreateIndexService的createIndex方法中完成.这里会提交一个高优先级,AckedClu ...

  5. elasticsearch index 之 create index(-)

    从本篇开始,就进入了Index的核心代码部分.这里首先分析一下索引的创建过程.elasticsearch中的索引是多个分片的集合,它只是逻辑上的索引,并不具备实际的索引功能,所有对数据的操作最终还是由 ...

  6. 如何使用CREATE INDEX语句对表增加索引?

    创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.删除索引可以利用ALTER TABLE或DROP INDE ...

  7. CREATE INDEX SELECT COUNT(*)

    CREATE INDEX windex_countrycode ON sales_rank (countrycode); CREATE INDEX windex_grab_amz_date ON sa ...

  8. SQL CREATE INDEX 语句

    CREATE INDEX 语句用于在表中创建索引. 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据. 索引 您可以在表中创建索引,以便更加快速高效地查询数据. 用户无法看到索引,它们只 ...

  9. mysql 索引查询 、创建 create index 与 add index 的区别

    1.索引查询 ------TABLE_SCHEMA  库名:TABLE  表名 ------AND UPPER(INDEX_NAME) != 'PRIMARY'  只查询索引,不需要主键 SELECT ...

  10. How MySQL Uses Indexes CREATE INDEX SELECT COUNT(*)

    MySQL :: MySQL 5.7 Reference Manual :: 9.3.1 How MySQL Uses Indexeshttps://dev.mysql.com/doc/refman/ ...

随机推荐

  1. Laravel入坑指南(1)——Hello World

    接触PHP已经挺长一段时间了,一直对这个世界上最好的语言情有独钟.用熟练了之后,发现PHP不仅是天下第一,而且是宇宙第一.但是自从Laravel诞生之后,博主一直对Laravel有莫名的抵触,觉得这个 ...

  2. Jsp+Servlet实现文件上传下载(二)--文件列表展示

    接着上一篇讲: Jsp+Servlet实现文件上传下载(一)--文件上传 点击打开链接 本章来实现一下上传文件列表展示,同时优化了一下第一章中的代码. 废话少说,上代码 --------------- ...

  3. 【Android逆向】IDA动态调试JNI_OnLoad 和 .init_array

    由于 JNI_OnLoad 和 .init_array 执行时间很早,so一加载到内存中就执行了,所以动态调试步骤会稍微要麻烦一些 1. 进入手机, 执行./android_server (如果是64 ...

  4. macOS安装RZ,SZ

    使用brew 安装lrzsz sudo brew install lrzsz 安装完成后检查是否存在. ls -alh /usr/local/bin/sz 如果安装报错可以手动下载压缩包安装,安装地址 ...

  5. 【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"

    问题描述 在博文 "[Azure Developer]使用 Powershell az account get-access-token 命令获取Access Token (使用用户名+密码 ...

  6. Java 多线程----- 解决线程安全问题的 方式三:Lock锁 --------jdk 5.0 新增

    1 package bytezero.deadlock; 2 3 import java.util.concurrent.locks.ReentrantLock; 4 5 /** 6 * 解决线程安全 ...

  7. 前端css阴影画图

    在线演示地址:css阴影画图 一,在css中有一个box-shadow属性,可以设置元素的阴影. .item{ width: 50px; height: 50px; background: #0096 ...

  8. 精贴总结 - Serverless 的承诺都兑现了吗

    原文 - Serverless 的承诺都兑现了吗? 一.个人看法 serverless根本目的是降低成本,所以baas是核心 冷启动是关键的技术难点,也限制了faas的作用域 供应商锁定是个坑,标准化 ...

  9. Python 在Word中创建表格并填入数据、图片

    在Word中,表格是一个强大的工具,它可以帮助你更好地组织.呈现和分析信息.本文将介绍如何使用Python在Word中创建表格并填入数据.图片,以及设置表格样式等. Python Word库: 要使用 ...

  10. 摆脱鼠标操作 - vscode - vim - 官方说明文档 github上的,防止打不开,这里发一个

    Key - command done - command done with VS Code specific customization ️ - some variations of the com ...