
# PCR UBTree
相比于RCR版本的UBTree，PCR版本的UBTree有以下特点。
- 索引元组的事务信息统一由TD槽进行管理。
- 增加了Undo操作，插入和删除前需要先写入Undo，事务abort时需要进行回滚操作。
- 支持闪回。
 
PCR UBTree通过在创建索引时with选项设置"index_txntype=pcr"或者设置GUC参数"index_txntype=pcr"进行创建。若没有显示指定with选项或者GUC，则默认创建RCR版本的UBTree。当前PCR版本的UBTree不支持在线进行创建、极致RTO回放和备机读的功能。
注意，当前版本PCR索引在大数据量的回滚上耗时可能较长（回滚时间随数据量增长可能呈指数型增长，数据量太大可能会导致回滚未完成），回滚时间会在下个版本进行优化。以下是当前版本回滚时间的具体规格：
表1PCR索引回滚时间的规格 
| 类型/数据量       | 100      | 1000     | 1万         | 10万           | 100万              |
|:---|:---|:---|:---|:---|:---|
| 带PCR索引的回滚时间  | 0.692 ms | 9.610 ms | 544.678 ms | 52,963.754 ms | 89,440,029.048 ms |
| 不带PCR索引的回滚时间 | 0.226 ms | 0.916 ms | 8.974 ms   | 94.903 ms     | 1206.177 ms       |
| 两者比值         | 3.06     | 10.49    | 60.70      | 558.08        | 74,151.66         |
   
#### PCR UBTree多版本管理
与RCR UBTree的区别是，PCR(Page Consistency Read) 的多版本管理是基于页面的多版本管理，所有元组的事务信息统一由TD槽进行管理。
#### PCR UBTree可见性机制
PCR UBTree可见性判断是通过把页面回滚到快照可见的时刻得到元组全部可见的页面完成的。
#### PCR UBTree增删改查
- **Insert操作**：操作与RCR UBTree基本一致，区别是：插入前需要先申请TD和写入Undo。
- **Delete操作**：操作与RCR UBTree基本一致，区别是：删除前需要先申请TD和写入Undo。
- **Update操作**：操作与RCR UBTree无区别，均转换为一条Delete操作和一条Insert操作。
- **Scan操作**：操作与RCR UBTree基本一致，区别是：查询操作需要将页面复制一个CR页面出来，将CR页面回滚到扫描快照可见的状态，从而整个页面的元组对于快照都是可见版本。
 
#### PCR UBTree空间管理
空间管理操作与RCR UBTree基本一致，区别是：PCR UBTree支持闪回，所以页面可回收的时间点由OldestXmin改成了GlobalRecycleXid。
