ALTER TABLE 之 定点变更(in-place alter)

2024-04-10 04:36
文章标签 定点 table 变更 alter place

本文主要是介绍ALTER TABLE 之 定点变更(in-place alter),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定点变更算法可以提供优于慢速变更算法的诸多性能优势:
定点变更算法:
1,增加了表的可用性
ALTER TABLE操作使用定点变更算法时,其他用户稍后可以访问该表,因为数据库服务器只在更新表定义和重建包含更改列的索引时才锁定该表。

对于要求7 * 24不停运行的应用程序系统,这种对表可用性的增强可以提高系统吞吐量。

使用定点变更算法时,数据库服务器锁定表的时间比慢速变更算法要短,因为数据库服务器:

  • 将表转换成新的定义肘,不必为表制作副本
  • 在ALERR TABLE 操作期间,不转换数据行
  • 当您以后更新或插入行时,在变更操作之后使用最新定义来定点变更物理列。数据库服务器对驻留在每页上的行进行转换。

2,需要的空间比慢速变更算法所需要的少
ALTER TABLE操作使用慢速变更算法时,数据库服务器将复制表以将该表转换为新定义。 ALTER TABLE操作要求空间至少为原始表大小的两倍与日志空间之和。
ALTER TABLE操作使用定点变更算法时,可以为非常大的表节省大量的空间。

3,在ALTER TABLE操作期间提高系统吞吐量
在定点变更操作期间,数据库服务器不会对表数据的任何更改进行日志记录。不对更改进行日志记录有以下优点:

  • 对于非常大的表,可以节省大量的日志空间
  • 变更操作不是长事务

数据库服务器何时使用定点变更算法:

对于您在ALTER TABLE语句的ADD、DROP 和MODIFY 子句中指定的特定操作类型,数据库服务器将使用定点变更算法。
变更表执行以下操作时,数据库服务器使用定点变更算法:

  • 除了使用ROWIDS 关键宇添加的列外,添加任何数据类型的列或者列的列表
  • 除了TEXT或BYTE以及使用ROWIDS 关键宇创建的列外,删除任何数据类型的列
  • 添加或删除使用CRCOLS 关键字创建的列
  • 修改满足以下条件的列:数据库服务器可以将其旧数据类型的所有可能值转换为新数据类型
  • 修改的列是分段存储表达式的一部分(如果转换后,值的更改不要求行从一个分段移到另一个分段)

注意:表包含扩展的数据类型、VARCHAR 数据类型、BOOLEAN 数据类型或智能大对象时,即使所变更的列包含内置数据类型,数据库服务器也不会使用定点变更算法。

使用定点变更算法的MODIFY操作和条件

源数据类型目标数据类型条件
SMALLINTINT、INT8、BIGINT、SMALLFLOAT或者FLOAT所有
SMALLINTDEC(p,s)p-s>=5
SMALLINTDEC§p>=5或者不是分片表达式的一部分
SMALLINTCHAR(n)n>=6且不是分片表达式的一部分
INT或SERIALINT8或者BIGINT所有
INT或SERIALDEC(p,s)p-s>=10
INT或SERIALDEC§p>=10或者不是分片表达式的一部分
INT或SERIALSMALLFLOAT不是分片表达式的一部分
INT或SERIALFLOAT所有
INT或SERIALCHAR(n)n>=11且不是分片表达式的一部分
SERIALSERIAL、SERIAL8或BIGSERIAL所有
DEC(p,s)SMALLINTp-s<5且(s=0或者不是分片表达式的一部分)
DEC(p,s)INT或SERIALp-s<10且(s=0或者不是分片表达式的一部分)
DEC(p,s)INT8、BIGINT、SERIAL8或BIGSERIALp-s<20且(s=0或者不是分片表达式的一部分)
DEC(p,s)DEC(p2,s2)p2-s2>=p-s且(s2>=s或者不是分片表达式的一部分)
DEC(p,s)DEC(p2)p2>=p或者不是分片表达式的一部分
DEC(p,s)SMALLFLOAT或FLOAT不是分片表达式的一部分
DEC(p,s)CHAR(n)n>=8且不是分片表达式的一部分
DEC§DEC(p2)p2>=p或者不是分片表达式的一部分
DEC§SMALLFLOAT或FLOAT不是分片表达式的一部分
DEC§CHAR(n)n>=8且不是分片表达式的一部分
SMALLFLOATDEC§或FLOAT不是分片表达式的一部分
SMALLFLOATCHAR(n)n>=8且不是分片表达式的一部分
FLOATDEC§或SMALLFLOAT不是分片表达式的一部分
FLOATCHAR(n)n>=8且不是分片表达式的一部分
CHAR(n)CHAR(n2)n2>=n或(不是分片表达式的一部分 且 非ANSI日志模式
增加长度CHAR(n)非ANSI日志模式
增加长度DEC或MONEY所有

附加信息:

  • DEC§是指将此数据类型作为浮点数据处理的非ANSI日志模式数据库
  • 在ANSI日志模式数据库中,DEC§缺省为DEC(p,0),并与DEC(p,s)使用相同的变更算法
  • 变更算法在不同版本中可能不同

不使用定点变更算法的变更操作:

在使用多个算法且值移动到其他分段时,数据库服务器不使用定点变更算法。

在以下情况中,数据库服务器不使用定点变更算法:

  • 正在使用的算法多于一种时
    如果ALTER TABLE 语句包含多个更改,那么数据库服务器在执行语句时将使用最低性能的算法。
  • 值必须移动到另一个分段时

变更作为索引的一部分的列:
如果变更的列是索引的一部分,那么表仍会定点变更,但此种情况下数据库服务器会重新建立一个或多个索引。如果不需耍重建索引,应在执行更改操作之前将其删除或禁用。执行这些步骤可以提高性能。

但是,如果修改的列是主键或外键,而且您想要保持这种约束,那么您必须再次在ALERR TABLE 语句中指定这些关键字,而且数据库服务器将重建索引。

即使对主键或外键列的ALERR TABLE操作重建了索引,数据库服务器仍将利用定点变更算法。定点变更算法在性能方面可以带来以下好处:

  • 无需为了将表转换成新定义而制作表的副本
  • 在变更操作期间不转换数据行
  • 并不重建对表的所有索引

这篇关于ALTER TABLE 之 定点变更(in-place alter)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890074

相关文章

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

通过Ajax请求后台数据,返回JSONArray(JsonObject),页面(Jquery)以table的形式展示

点击“会商人员情况表”,弹出层,显示一个表格,如下图: 利用Ajax和Jquery和JSONArray和JsonObject来实现: 代码如下: 在hspersons.html中: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>会商人员情况表</title><script type="text/javasc

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

css-table

设置table的文字不换行:给th,td添加white-space: nowrap; 设置单元格内容及其边框的距离:使用html的cellpadding属性,还有一种方式设置padding。在CSS中,table, th, td{padding:0;}效果等同于cellpadding="0″。 设置table的单元格边距:border-spacing如果定义一个 length 参数,那么定义的是水

react antd table expandable defaultExpandAllRows 不生效问题

原因:defaultExpandAllRows只会在第一次渲染时触发 解决方案:渲染前判断table 的datasource 数据是否已准备好 {pageList.length > 0 ? (<TablerowSelection={rowSelection}columns={columns}dataSource={pageList}style={{ marginTop: 24 }}pagina

el-table 封装表格(完整代码-实时更新)

最新更新时间: 2024年9月6号 1. 添加行内编辑、表头搜索 <template><!-- 简单表格、多层表头、页码、没有合并列行 --><div class="maintenPublictable"element-loading-background="rgba(255,255,255,0.5)"><!--cell-style 改变某一列行的背景色 --><!-- tree-props

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor

quill官方中文文档:https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意:想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装: npm install quill@latest   版本需要大于2.0版本 npm install quill-better-table 引入&

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

table跨行跨列,字体大小

table跨行跨列,字体大小 <table width="100%"> <tr>         <td style="vertical-align:top"><font size="7">某某</font></td>         <td style="vertical-align:top" colspan="2" align="right"><font size="5">求职意向:W

Apache-Flink深度解析-Temporal-Table-JOIN

在《JOIN LATERAL》中提到了Temporal Table JOIN,本篇就向大家详细介绍什么是Temporal Table JOIN。在ANSI-SQL 2011 中提出了Temporal 的概念,Oracle,SQLServer,DB2等大的数据库厂商也先后实现了这个标准。Temporal Table记录了历史上任何时间点所有的数据改动,Temporal Table的工作流程如下: