前言:

我们知道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. SpringBoot相关注解使用

    @MapperScan注解和@Mapper @Mapper常用在相应的 *Mapper类上,但是每个类都使用相对麻烦,所以后来用@MapperScan替代 ,@MapperScan注解使用在启动类上. ...

  2. 使用ORACLE外部表装载复杂数据

    原文:http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13asktom-1886639.html I am using SQL ...

  3. 【Android逆向】修改so文件方式修改程序行为

    1. 还是之前的那个apk 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 尝试使用 010Editor来修改so文件 2. 使用 ...

  4. Vulnhub靶机网卡启动失败(Raise network interfaces)

    问题 使用一些Linux靶机进行搭建后可能会出现无法搜索到IP的情况,并且会在系统启动时报错,类似下图所示 这个主要是因为vulnhub上的镜像由于搭建环境.版本等问题不适配,网卡没有正确识别导致的, ...

  5. 在Study.BlazorOne项目中引入Study.Trade模块的实体的表结构

    # 1.修改EntityFrameworkCore项目下的BlazorOneDbContext文件,增加一行代码即可 增加Study.Trade.EntityFrameworkCore中的这个方法: ...

  6. 【Azure 事件中心】通过 az rest --method get 如何获得Event Hub Entity 级的统计指标

    问题描述 通过 az rest --method get  如何获得Event Hub Entity 级的统计指标? 问题解答 查阅文档  https://learn.microsoft.com/en ...

  7. C#多线程(11):线程等待

    目录 前言 volatile 关键字 三种常用等待 再说自旋和阻塞 SpinWait 结构 属性和方法 自旋示例 新的实现 SpinLock 结构 属性和方法 示例 等待性能对比 前面我们学习了很多用 ...

  8. Tomcat8.5简介

    1. Tomcat简介[1] Apache Tomcat是Servlet/JSP的容器.Tomcat8.5 实现了由 JCP 组织 (Java Community Process) 制定的Servle ...

  9. 专访实在智能孙林君:颠覆传统RPA的实在IPA模式如何做到真正人人可用?

      王吉伟对话实在智能孙林君:颠覆传统引领RPA行业的实在IPA模式是如何炼成的? 王吉伟对话实在智能孙林君:为什么第一款颠覆行业的RPA诞生在实在智能? 专访实在智能孙林君:打造出真正人人可用的实在 ...

  10. git 常见命令和资源

    git练习 常用git清单 强制切换分支所指位置 git branch -f main c3强制分支main指向c3 git branch -f main HEAD~3强制分支main指向head的父 ...