
# UB-tree增删改查
- **Insert操作**：UB-tree的插入逻辑基本不变，只需增加索引插入时直接获取事务信息填写xmin字段。
- **Delete操作**：UB-tree额外增加了索引删除流程，索引删除主要步骤与插入相似，获取事务信息填写xmax字段（B-tree索引不维护版本信息，不需要删除操作）,同时更新页面上的active_tuple_count，若active_tuple_count被减为0，则尝试页面回收。
- **Update操作** ：对于Ustore而言，数据更新对UB-tree索引列的操作也与Astore有所不同，数据更新包含两种情况：索引列和非索引列更新，下图给出了UB-tree在数据发生更新时的处理。
  ![](https://support.huaweicloud.com/fg-gaussdb-cent/figure/zh-cn_image_0000002222921174.png "点击放大")
  上图展示UB-tree在索引列和非索引列更新的差异：
  1. 在非索引列更新的情况下，索引不发生任何变化，index tuple仍指向第一次插入的data tuple，Uheap不会插入新的data tuple，而是修改当下data tuple并将历史数据存入Undo中。
  
  2. 在索引列更新的情况下，UB-tree也会插入新的index tuple，但是会指向同一个data linepointer和同一个data tuple，扫描旧版本的数据则需要从Undo中读取。
   
- **Scan操作** ：用户在读取数据时，可通过使用索引扫描加速，UB-tree支持索引数据的多版本管理及可见性检查，索引层的可见性检查使得索引扫描（Index Scan）及仅索引扫描（IndexOnly Scan）性能有所提升。
  对于索引扫描：
  1. 若索引列包含所有扫描列（IndexOnly Scan），则通过扫描条件在索引上进行二分查找，找到符合条件元组即可返回数据。
  
  2. 若索引列不包含所有扫描列（Index Scan），则通过扫描条件在索引上进行二分查找，找到符合条件元组的TID，再通过TID到数据表上查找对应的数据元组。如下图所示。 ![](https://support.huaweicloud.com/fg-gaussdb-cent/figure/zh-cn_image_0000002258040693.png "点击放大")
     
   
 
