Oracle 20c新特性:TRANSFORM支持索引压缩

2022-04-24 09:49:31 浏览数 (2)

Oracle 20c 通过引入新的 TRANSFORM 参数子句 INDEX_COMPRESSION_CLAUSE  来支持索引压缩。此子句使您可以控制在导入期间是否执行索引压缩。

    数据泵 impdp 命令行模式下TRANSFORM参数介绍。

  • 语法和说明
代码语言:javascript复制
TRANSFORM = transform_name:value[:object_type]

transform_name 指定转换的名称。

object_type 是可选的。如果提供,则此参数指定要对其应用转换的对象类型。如果未指定对象类型,则转换将应用于所有有效的对象类型。

可用的转换如下,按字母顺序排列:

  • CONSTRAINT_NAME_FROM_INDEX: [Y | N ] 此转换对以下对象类型有效:TABLE 和 CONSTRAINT 对象类型。 此转换参数影响参考用户创建的索引的 pk 或 fk 约束的生成。如果设置为 Y,它将强制约束的名称与索引的名称匹配。 如果设置为 N(默认值),则约束将按源数据库中的名称创建。
  • CONSTRAINT_USE_DEFAULT_INDEX: [Y | N ] 此转换对以下对象类型有效:TABLE 和 CONSTRAINT 对象类型。 此转换参数影响与 pk 或fk约束有关的索引的生成。如果设置为 Y,它将强制自动创建以强制约束的索引名称与约束名称相同。 如果设置为 N(默认值),那么将按照源数据库中的名称创建索引。
  • DISABLE_ARCHIVE_LOGGING:[Y | N] 此转换对以下对象类型有效:INDEX 和 TABLE。 如果设置为 Y,则在导入数据之前,将禁用指定对象类型(TABLE 和/或 INDEX)的日志记录属性。如果设置为 N(默认值),则导入期间不会禁用存档日志记录。加载数据后,对象的日志记录属性将还原为其原始设置。如果未指定对象类型,则 DISABLE_ARCHIVE_LOGGING 行为将应用于 TABLE 和 INDEX 对象类型。此转换适用于文件模式导入和网络模式导入。它不适用于可移植表空间导入。 注意:如果数据库处于 FORCE LOGGING 模式,则在创建索引和表时DISABLE_ARCHIVE_LOGGING 选项不会禁用日志记录。
  • DWCS_CVT_IOTS: [Y | N ] 此转换对 TABLE 对象类型有效。 如果设置为 Y,它会在创建表时通过 ORGANIZATION INDEX 子句来指示数据泵将索引组织表转换为堆组织表。 如果设置为 N(默认值),则生成的DDL将保留源对象的表特征。
  • DWCS_CVT_CONSTRAINTS: [Y | N ] 此转换对以下对象类型有效:TABLE 和 CONSTRAINT 对象类型。 如果设置为Y,它将指示数据泵创建禁用的pk,fk或uk约束。 如果设置为N(默认值),它将根据源数据库状态将数据泵定向到创建 pk,fk或uk约束。
  • INDEX_COMPRESSION_CLAUSE [NONE | compression_clause] 此转换对对象类型INDEX有效。与 TABLE_COMPRESSION_CLAUSE 一样,INDEX_COMPRESSION_CLAUSE 使您可以控制导入时的索引压缩。 如果指定了 NONE,则省略索引压缩子句(并且为索引提供表空间的默认压缩)。但是,如果使用压缩,则 Oracle 建议您使用 COMPRESS ADVANCED LOW。使用指定的压缩创建索引。 如果索引压缩子句超过一个单词,则必须将其包含在单引号或双引号中。另外,您的操作系统可能要求您将子句括在转义字符(例如反斜杠字符)中。例如: TRANSFORM=INDEX_COMPRESSION_CLAUSE:"COMPRESS ADVANCED LOW" 指定此转换将更改作业中所有索引的压缩类型。 注意:INDEX_COMPRESSION_CLAUSE 转换仅在Oracle 20c中支持。
  • INMEMORY:[Y | N] 此转换对以下对象类型有效:TABLE 和 TABLESPACE。 INMEMORY 转换与内存中列存储(IM列存储)有关。IM列存储是系统全局区域(SGA)的可选部分,用于存储表,表分区和其他数据库对象的副本。在IM列存储中,数据是按列而不是行填充的,就像在SGA的其他部分一样,并且针对快速扫描对数据进行了优化。IM列存储不会替代缓冲区高速缓存,而是作为补充,以便两个存储区都可以不同格式存储相同数据。IM列存储包含在Oracle Database In-Memory选项中。 如果在导入时指定了Y(默认值),则数据泵会为所有具有一个的对象保留IM列存储子句。在导入时重新创建这些对象时,数据泵会生成与导出时与那些对象的设置匹配的IM列存储子句。 如果在导入时指定了N,则数据泵将从具有一个的所有对象中删除IM列存储子句。如果没有存储在表空间中的对象的IM列存储子句,则该对象将从表空间继承IM列存储子句。因此,如果要迁移数据库,并且希望新数据库使用IM列存储功能,则可以使用适当的IM列存储子句预先创建表空间,然后在导入命令上使用 TRANSFORM=INMEMORY:N。然后,该对象从新的预先创建的表空间继承IM列存储子句。 如果不使用 INMEMORY 转换,则必须单独更改每个对象以添加适当的IM列存储子句。 注意:INMEMORY 转换仅在Oracle Database 12c第1版(12.1.0.2)或更高版本中可用。
  • INMEMORY_CLAUSE:"string with a valid in-memory parameter” INMEMORY_CLAUSE 转换与内存中列存储(IM列存储)相关。IM列存储是系统全局区域(SGA)的可选部分,用于存储表,表分区和其他数据库对象的副本。在IM列存储中,数据是按列而不是行填充的,就像在SGA的其他部分一样,并且针对快速扫描对数据进行了优化。IM列存储不会替代缓冲区高速缓存,而是作为补充,以便两个存储区都可以不同格式存储相同数据。IM列存储包含在Oracle Database In-Memory选项中。 指定此转换时,数据泵会将字符串的内容用作 INMEMORY_CLAUSE,用于所有导入的对象(其DDL中具有IM列存储子句)。当您要为转储文件中的对象覆盖IM列存储子句时,此转换很有用。 您提供的字符串必须用双引号引起来。如果要在命令行上输入命令,请注意,某些操作系统可能会在分析命令期间删除引号,这会导致错误。您可以通过使用反斜杠转义符()来避免此错误。例如:

代码语言:javascript复制
transform=inmemory_clause:"INMEMORY MEMCOMPRESS FOR DML PRIORITY CRITICAL"

或者,您可以将参数放入参数文件中。参数文件中的引号在处理过程中得到维护。 注意:INMEMORY_CLAUSE 转换仅在Oracle Database 12c第1版(12.1.0.2)或更高版本中可用。

  • LOB_STORAGE:[SECUREFILE | BASICFILE | DEFAULT | NO_CHANGE] 此转换对对象类型 TABLE 有效。 将使用指定的存储(SECUREFILE 或 BASICFILE)创建LOB段。如果值为 NO_CHANGE(默认值),则将使用与源数据库中相同的存储来创建LOB段。如果值为 DEFAULT,则省略关键字(SECUREFILE或BASICFILE),并使用默认存储创建LOB段。 指定此转换会更改作业中所有表的LOB存储,包括为实例化视图提供存储的表。 LOB_STORAGE转换在可移植的导入作业中无效。
  • OID:[Y | N] 此转换对以下对象类型有效: INC_TYPE,TABLE 和 TYPE。 如果在导入时指定Y(默认值),则将导出的OID分配给新的对象表和类型。 在目标数据库上查找现有匹配类型时,Data Pump还会执行OID检查。 如果在导入时指定了N,则:
    • 在创建新对象表和类型的过程中,禁止分配导出的OID。而是分配一个新的OID。禁止分配导出的OID对克隆模式很有用,但不会影响引用的对象。
    • 在为与类型关联的表加载数据之前,数据泵在目标数据库中查找现有匹配类型时会跳过常规类型OID检查。仍然执行使用哈希码检查类型,版本号和类型名称的其他检查。
  • OMIT_ENCRYPTION_CLAUSE: [Y | N ] 此转换对 TABLE 对象类型有效。 如果设置为Y,它将指示数据泵禁止列加密子句。在源数据库中加密的列在导入的表中未加密。 如果设置为N(默认值),它将指示数据泵像源数据库中一样创建列加密子句。
  • PCTSPACE:some_number_greater_than_zero 此转换对以下对象类型有效: CLUSTERCONSTRAINT,INDEXROLLBACK_SEGMENTTABLE 和 TABLESPACE。 为此转换提供的值必须是大于零的数字。它表示用于更改范围分配和数据文件大小的百分比乘数。 您可以将 PCTSPACE 转换与“数据泵导出 SAMPLE”参数一起使用,以便存储分配的大小与采样数据子集匹配。
  • SEGMENT_ATTRIBUTES:[Y | N] 此转换对以下对象类型有效:CLUSTERCONSTRAINTINDEXROLLBACK_SEGMENT,TABLE 和 TABLESPACE。 如果将值指定为Y,则将包含段属性(物理属性,存储属性,表空间和日志记录)以及适当的DDL。默认值为Y。
  • SEGMENT_CREATION:[Y | N] 此转换对对象类型 TABLE 有效。 如果设置为Y(默认值),则此转换会导致将SQL SEGMENT CREATION子句添加到 CREATE TABLE 语句中。也就是说,CREATE TABLE 语句明确表示 SEGMENT CREATION DEFERRED 或 SEGMENT CREATION IMMEDIATE。如果值为N,则从 CREATE TABLE 语句中省略 SEGMENT CREATION 子句。将此参数设置为N可以为要加载的表使用默认的段创建属性。(此功能在Oracle Database 11g第2版(11.2.0.2)和更高版本中可用。
  • STORAGE:[Y | N] 此转换对以下对象类型有效:CLUSTERCONSTRAINT,INDEXROLLBACK_SEGMENT 和 TABLE。 如果将值指定为Y,则包含存储子句以及适当的DDL。默认值为Y。如果SEGMENT_ATTRIBUTES=N,则忽略此参数。
  • TABLE_COMPRESSION_CLAUSE:[NONE | compression_clause] 此转换对对象类型 TABLE 有效。

如果指定了 NONE,则省略表压缩子句(并且为表提供表空间的默认压缩)。 否则,该值是有效的表压缩子句(例如,NOCOMPRESSCOMPRESS BASIC等)。 表以指定的压缩率创建。

如果表压缩子句超过一个单词,则必须将其包含在单引号或双引号中。 另外,您的操作系统可能要求您将子句括在转义字符(例如反斜杠字符)中。 例如:

代码语言:javascript复制
TRANSFORM=TABLE_COMPRESSION_CLAUSE:"COLUMN STORE COMPRESS FOR QUERY HIGH"

指定此转换将更改作业中所有表的压缩类型,包括为实例化视图提供存储的表。

  • 示例

对于以下示例,假设您已在hr模式中导出了 employees 表。然后导入表时产生的CREATE TABLE 语句类似于以下内容:

代码语言:javascript复制
CREATE TABLE "HR"."EMPLOYEES"
   ( "EMPLOYEE_ID" NUMBER(6,0),
     "FIRST_NAME" VARCHAR2(20),
     "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
     "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
     "PHONE_NUMBER" VARCHAR2(20),
     "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
     "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
     "SALARY" NUMBER(8,2),
     "COMMISSION_PCT" NUMBER(2,2),
     "MANAGER_ID" NUMBER(6,0),
     "DEPARTMENT_ID" NUMBER(4,0)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 10240 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 121
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "SYSTEM" ;

如果您不想保留 STORAGE 子句或 TABLESPACE 子句,则可以使用导入 TRANSFORM 参数将它们从 CREATE STATEMENT 中删除。将 SEGMENT_ATTRIBUTES 的值指定为N。

代码语言:javascript复制
impdp hr TABLES=hr.employees DIRECTORY=dpump_dir1 DUMPFILE=hr_emp.dmp
  TRANSFORM=SEGMENT_ATTRIBUTES:N:table

然后,employees 表的结果 CREATE TABLE 语句看起来类似于以下内容。它不包含 STORAGE 或 TABLESPACE 子句;而是使用HR模式的默认表空间的属性。

代码语言:javascript复制
CREATE TABLE "HR"."EMPLOYEES"
   ( "EMPLOYEE_ID" NUMBER(6,0),
     "FIRST_NAME" VARCHAR2(20),
     "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
     "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
     "PHONE_NUMBER" VARCHAR2(20),
     "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
     "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
     "SALARY" NUMBER(8,2),
     "COMMISSION_PCT" NUMBER(2,2),
     "MANAGER_ID" NUMBER(6,0),
     "DEPARTMENT_ID" NUMBER(4,0)
   );

如前面的示例所示,SEGMENT_ATTRIBUTES 转换适用于存储和表空间属性。要仅忽略 STORAGE 子句并保留 TABLESPACE 子句,可以使用 STORAGE 转换,如下所示:

代码语言:javascript复制
impdp hr TABLES=hr.employees DIRECTORY=dpump_dir1 DUMPFILE=hr_emp.dmp
  TRANSFORM=STORAGE:N:table

通过不在 TRANSFORM 参数上指定对象类型,可以将 SEGMENT_ATTRIBUTES 和 STORAGE 转换应用于所有适用的表和索引对象,如以下命令所示:

代码语言:javascript复制
impdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp SCHEMAS=hr TRANSFORM=SEGMENT_ATTRIBUTES:N

0 人点赞