华为云用户手册

  • DROP删除表 GaussDB(DWS)与MySQL都支持使用DROP语句删除表,但GaussDB(DWS)不支持在DROP语句中使用 RESTRICT | CASCADE 关键字。DSC工具迁移时会将上述关键字移除。 输入示例 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `public`.`express_elb_server`( `runoob_id` VARCHAR(10), `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` VARCHAR(10) )ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE `public`.`express_elb_server` RESTRICT; 输出示例 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE IF NOT EXISTS "public"."express_elb_server" ( "runoob_id" VARCHAR(40), "runoob_title" VARCHAR(400) NOT NULL, "runoob_author" VARCHAR(160) NOT NULL, "submission_date" VARCHAR(40) ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("runoob_id"); DROP TABLE "public"."express_elb_server"; 父主题: 表(可选参数、操作)
  • PL/SQL包 本节主要介绍Oracle PL/SQL包(详情请参见包)和REF CURSOR(详情请参见REF CURSOR)的迁移语法。迁移语法决定了关键字/功能的迁移方式。 本节包括以下内容: 包、包变量、包拆分、REF CURSOR、VARRAY、创建包模式、授予执行权限、包名列表、数据类型,各节点的具体内容详见包~数据类型章节。 包 包变量 包拆分 REF CURSOR 创建包模式 父主题: Oracle语法迁移
  • MAX_ROWS 在MySQL中,MAX_ROWS表示在表中存储的最大行数。DSC迁移过程时会将该属性删除。 输入示例 1 2 3 4 5 6 7 8 9 CREATE TABLE `public`.`runoob_alter_test`( `dataType1` int NOT NULL AUTO_INCREMENT, `dataType2` DOUBLE(20,8), `dataType3` TEXT NOT NULL, PRIMARY KEY(`dataType1`) ); ALTER TABLE runoob_alter_test MAX_ROWS 100000; ALTER TABLE runoob_alter_test MAX_ROWS=100000; 输出示例 1 2 3 4 5 6 7 8 9 10 CREATE TABLE "public"."runoob_alter_test" ( "datatype1" SERIAL NOT NULL, "datatype2" DOUBLE PRECISION, "datatype3" TEXT NOT NULL, PRIMARY KEY ("datatype1") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype1"); 父主题: 表(可选参数、操作)
  • 接口介绍 高级功能包DBMS_RANDOM支持的所有接口请参见表1。 表1 DBMS_RANDOM接口参数说明 接口名称 描述 DBMS_RANDOM.SEED 设置一个随机数的种子。 DBMS_RANDOM.VALUE 生成一个大小介于指定的low及high之间的随机数。 DBMS_RANDOM.SEED 存储过程SEED用于设置一个随机数的种子。DBMS_RANDOM.SEED函数原型为: 1 DBMS_RANDOM.SEED (seed IN INTEGER); 表2 DBMS_RANDOM.SEED接口参数说明 参数 描述 seed 用于产生一个随机数的种子。 DBMS_RANDOM.VALUE 存储过程VALUE生成一个大小介于指定的low及high之间的随机数。DBMS_RANDOM.VALUE函数原型为: 1 2 3 4 DBMS_RANDOM.VALUE( low IN NUMBER, high IN NUMBER) RETURN NUMBER; 表3 DBMS_RANDOM.VALUE接口参数说明 参数 描述 low 指定随机数大小的下边界,生成的随机数大于或等于low。 high 指定随机数大小的上边界,生成的随机数小于high。 实际上,只要求这里的参数类型是NUMERIC即可,对于左右边界的大小并没有要求。
  • 类型对照 表1 日期和时间类型对照表 MySQL日期时间类型 MySQL INPUT GaussDB(DWS) OUTPUT DATETIME DATETIME[(fsp)] TIMESTAMP[(fsp)] WITHOUT TIME ZONE TIME TIME[(fsp)] TIME[(fsp)] WITHOUT TIME ZONE TIMESTAMP TIMESTAMP[(fsp)] TIMESTAMP[(fsp)] WITH TIME ZONE YEAR YEAR[(4)] SMALLINT(4) 该fsp值如果给出,则必须在0到6的范围内。值为0表示没有小数部分。如果省略,则默认精度为0。 输入示例DATETIME 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` DATETIME, `dataType_2` DATETIME(0), `dataType_3` DATETIME(6), `dataType_4` DATETIME DEFAULT NULL, `dataType_5` DATETIME DEFAULT '2018-10-12 15:27:33.999999' ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" TIMESTAMP WITHOUT TIME ZONE, "datatype_2" TIMESTAMP(0) WITHOUT TIME ZONE, "datatype_3" TIMESTAMP(6) WITHOUT TIME ZONE, "datatype_4" TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, "datatype_5" TIMESTAMP WITHOUT TIME ZONE DEFAULT '2018-10-12 15:27:33.999999' ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1"); 输入示例TIME 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` TIME DEFAULT '20:58:10', `dataType_2` TIME(3) DEFAULT '20:58:10', `dataType_3` TIME(6) DEFAULT '20:58:10', `dataType_4` TIME(6) DEFAULT '2018-10-11 20:00:00', `dataType_5` TIME(6) DEFAULT '20:58:10.01234', `dataType_6` TIME(6) DEFAULT '2018-10-11 20:00:00.01234', `dataType_7` TIME DEFAULT NULL, `dataType_8` TIME(6) DEFAULT NULL, PRIMARY KEY (dataType_1) ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" TIME WITHOUT TIME ZONE DEFAULT '20:58:10', "datatype_2" TIME(3) WITHOUT TIME ZONE DEFAULT '20:58:10', "datatype_3" TIME(6) WITHOUT TIME ZONE DEFAULT '20:58:10', "datatype_4" TIME(6) WITHOUT TIME ZONE DEFAULT '2018-10-11 20:00:00', "datatype_5" TIME(6) WITHOUT TIME ZONE DEFAULT '20:58:10.01234', "datatype_6" TIME(6) WITHOUT TIME ZONE DEFAULT '2018-10-11 20:00:00.01234', "datatype_7" TIME WITHOUT TIME ZONE DEFAULT NULL, "datatype_8" TIME(6) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY ("datatype_1") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1"); 输入示例TIMESTAMP 1 2 3 4 5 6 7 8 9 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` TIMESTAMP, `dateType_4` TIMESTAMP DEFAULT '2018-10-12 15:27:33', `dateType_5` TIMESTAMP DEFAULT '2018-10-12 15:27:33.999999', `dateType_6` TIMESTAMP DEFAULT '2018-10-12 15:27:33', `dateType_7` TIMESTAMP DEFAULT '2018-10-12 15:27:33', `dataType_8` TIMESTAMP(0) DEFAULT '2018-10-12 15:27:33', `dateType_9` TIMESTAMP(6) DEFAULT '2018-10-12 15:27:33' ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" TIMESTAMP WITH TIME ZONE, "datetype_4" TIMESTAMP WITH TIME ZONE DEFAULT '2018-10-12 15:27:33', "datetype_5" TIMESTAMP WITH TIME ZONE DEFAULT '2018-10-12 15:27:33.999999', "datetype_6" TIMESTAMP WITH TIME ZONE DEFAULT '2018-10-12 15:27:33', "datetype_7" TIMESTAMP WITH TIME ZONE DEFAULT '2018-10-12 15:27:33', "datatype_8" TIMESTAMP(0) WITH TIME ZONE DEFAULT '2018-10-12 15:27:33', "datetype_9" TIMESTAMP(6) WITH TIME ZONE DEFAULT '2018-10-12 15:27:33' ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1"); 输入示例YEAR 1 2 3 4 5 6 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` YEAR, `dataType_2` YEAR(4), `dataType_3` YEAR DEFAULT '2018', `dataType_4` TIME DEFAULT NULL ); 输出示例 1 2 3 4 5 6 7 8 9 10 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" SMALLINT, "datatype_2" SMALLINT, "datatype_3" VARCHAR(4) DEFAULT '2018', "datatype_4" TIME WITHOUT TIME ZONE DEFAULT NULL ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1");
  • 声明 GaussDB(DWS)的作者们在进行文档写作时努力基于商用角度,从使用场景和任务完成角度给出内容指引。即使这样,文档中依然可能存在对Postgres内容的引用和参考。对于这类内容,遵从如下的Postgres Copyright: Postgres-XC is Copyright © 1996-2013 by the PostgreSQL Global Development Group. PostgreSQL is Copyright © 1996-2013 by the PostgreSQL Global Development Group. Postgres95 is Copyright © 1994-5 by the Regents of the University of California. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS-IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  • ALGORITHM MySQL扩展了对ALTER TABLE … ALGORITHM=INSTANT的支持:用户可以在表的任何位置即时添加列、即时删除列、添加列时评估行大小限制。 GaussDB(DWS)不支持此属性,并在迁移过程中被DSC删除。 输入示例 1 2 3 4 5 6 7 8 9 ALTER TABLE runoob_alter_test ALGORITHM=DEFAULT; ALTER TABLE runoob_alter_test ALGORITHM=INPLACE; ALTER TABLE runoob_alter_test ALGORITHM=COPY; ALTER TABLE runoob_alter_test ADD COLUMN COL_18 VARCHAR(64) DEFAULT '00', ALGORITHM=INSTANT; ALTER TABLE runoob_alter_test MODIFY COLUMN dataType7 BIGINT, ALGORITHM=COPY; ALTER TABLE `runoob_alter_test` ALGORITHM=DEFAULT, ALGORITHM=INPLACE, ALGORITHM=COPY; ALTER TABLE `runoob_alter_test` ADD COLUMN dataType11 INT, ALGORITHM=DEFAULT, ALGORITHM=INPLACE, ALGORITHM=COPY; ALTER TABLE runoob_alter_test CHANGE COLUMN dataType11 dataType12 SMALLINT ,ALGORITHM=INPLACE, ALGORITHM=COPY; ALTER TABLE runoob_alter_test ALGORITHM=INPLACE, ALGORITHM=COPY, DROP COLUMN dataType12; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ALTER TABLE "public"."runoob_alter_test" ADD COLUMN "col_18" VARCHAR(256) DEFAULT '00'; ALTER TABLE "public"."runoob_alter_test" MODIFY "datatype7" BIGINT NULL DEFAULT NULL; ALTER TABLE "public"."runoob_alter_test" ADD COLUMN "datatype11" INTEGER; ALTER TABLE "public"."runoob_alter_test" CHANGE COLUMN "datatype11" "datatype12" SMALLINT NULL DEFAULT NULL; ALTER TABLE "public"."runoob_alter_test" DROP COLUMN "datatype12" RESTRICT; DROP TABLE IF EXISTS "public"."runoob_alter_test"; 父主题: 表(可选参数、操作)
  • 应用示例 查看所有订阅: 1 2 3 4 5 SELECT * FROM pg_subscription; subdbid | subname | subowner | subenabled | subconninfo | subslotname | subpublications ---------+---------+----------+------------+------------------------------------------------------------------------------------------+-------------+----------------- 15992 | mysub | 10 | t | host=1.1.1.1,2.2.2.2 port=10000,20000 dbname=postgres user=repusr1 password=password_123 | mysub | {mypub} (1 row)
  • 管理SQL终端连接 在Data Studio中,用户查看执行计划和成本、可视化计划解释以及在结果集中进行操作时,可重用SQL终端中的现有连接或新建连接。默认情况下,SQL终端会重用现有连接。当有多个查询在现有连接中排队等待执行时,请使用新连接,因为查询会按顺序执行且可能存在延迟。在处理临时表时请重用现有连接。有关编辑临时表的详情,请参阅编辑临时表。 要更改该设置,请执行以下步骤: 单击启用或禁用SQL终端中的连接重用功能。 有关重用连接和新建连接时的查询执行行为,请参阅FAQs。 用户仅能在已有连接中编辑临时表。 父主题: SQL终端管理
  • 类型转换时优先执行数据库操作 输入 输出 1 2 3 4 5 6 7 8 9 10 11 REPLACE VIEW SC.VIEW_1 ( col_1 ) LOCKING TABLE sc.tab FOR ACCESS AS SEL (COALESCE(TRIM(TGT.col_1),'')) || '_' || (COALESCE(TRIM(TGT.col_1),'')) (CHAR(22)) AS col_1 FROM sc.tab TGT ; 1 2 3 4 5 6 7 8 9 10 11 CREATE OR REPLACE VIEW SC.VIEW_1 (col_1) /*LOCKING TABLE sc.tab FOR ACCESS */ AS ( SELECT CAST( ( COALESCE( TRIM( TGT.col_1 ) ,'' ) ) || '_' || ( COALESCE( TRIM( TGT.col_1 ) ,'' ) ) AS CHAR( 22 ) ) AS col_1 FROM sc.tab TGT ) ;
  • 以#开头的列名 输入 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 REPLACE VIEW SC.VIEW_1 ( ,col_1 ,#_col_2 ,#_col_3 ) LOCKING TABLE sc.tab FOR ACCESS AS SEL Tgt.col1 ,Tgt.#_col_2 ,Tgt.#_col_3 FROM sc.tab TGT ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE OR REPLACE VIEW SC.VIEW_1 ( ,col_1 ,"#_COL_2" ,"#_COL_3" ) /*LOCKING TABLE sc.tab FOR ACCESS */ AS ( SELECT Tgt.col1 ,Tgt."#_COL_2" ,Tgt."#_COL_3" FROM sc.tab TGT ) ;
  • 以YYYYDDD格式输入日期 输入 输出 1 2 3 4 5 6 7 8 9 10 11 12 REPLACE VIEW SC.VIEW_1 ( col_1 ) LOCKING TABLE sc.tab FOR ACCESS AS SEL --tgt.col_1 is date type CAST( CAST(TGT.col_1 AS DATE FORMAT 'YYYYDDD') AS CHAR(7) ) AS col_1 FROM sc.tab TGT ; 1 2 3 4 5 6 7 8 9 10 CREATE OR REPLACE VIEW SC.VIEW_1 (col_1) /*LOCKING TABLE sc.tab FOR ACCESS */ AS ( SELECT /* tgt.col_1 is date type */ CAST( TO_DATE(TGT.col_1, 'YYYYDDD') AS CHAR( 7 ) ) AS col_1 FROM sc.tab TGT ) ;
  • 以YYYYMMDD格式输入的日期 输入 输出 1 2 3 SELECT 1 FROM tb_dt_fmtyyyymmdd WHERE JobName ='${JOB_NAME}' AND TXDATE = ${TX_DATE} - 19000000; SELECT 1 FROM tb_dt_fmtyyyymmdd WHERE JobName ='${JOB_NAME}' AND TXDATE = TO_DATE(${TX_DATE}, 'YYYYMMDD');
  • 注意事项 新序列值的产生是靠GTM维护的,默认情况下,每申请一个序列值都要向GTM发送一次申请,GTM在当前值的基础上加上步长值作为产生的新值返回给调用者。GTM作为全局唯一的节点,势必成为性能的瓶颈,所以对于需要大量频繁产生序列号的操作,如使用Bulkload(批量快速导入数据)功能进行数据导入场景,是非常不推荐产生默认序列值的。比如,在下面所示的场景中, INSERT FROM SELECT语句的性能会非常慢。 1 2 3 4 5 6 7 CREATE SEQUENCE newSeq1; CREATE TABLE newT1 ( id int not null default nextval('newSeq1'), name text ); INSERT INTO newT1(name) SELECT name from T1; 可以提高性能的写法是(假设T1表导入newT1表中的数据为10000行): 1 2 INSERT INTO newT1(id, name) SELECT id,name from T1; SELECT SETVAL('newSeq1',10000); 序列操作函数nextval(),setval() 等均不支持回滚。另外setval设置的新值,会对当前会话的nextval立即生效,但对其他会话,如果定义了cache,不会立即生效,在用尽所有缓存的值后,其变动才被其他会话感知。所以为了避免产生重复值,要谨慎使用setval,设置的新值不能是已经产生的值或者在缓存中的值。 如果必须要在bulkload场景下产生默认序列值,则一定要为newSeq1定义足够大的cache,并且不要定义Maxvalue或者Minvalue。数据库会试图将nextval('sequence_name')的调用下推到Data Node,以提高性能。 目前GTM对并发的连接请求是有限制的,当Data Node很多时,将产生大量并发连接, 这时一定要控制bulkload的并发数目,避免耗尽GTM的连接资源。如果目标表为复制表(DISTRIBUTE BY REPLICATION)时下推将不能进行。当数据量较大时,这对数据库将是个灾难。除了性能问题之外,空间也可能会剧烈膨胀,在导入结束后,需要用vacuum full来恢复。最好的方式还是如上建议的,不要在bulkload的场景中产生默认序列值。 另外,序列创建后,在每个节点上都维护了一张单行表,存储序列的定义及当前值,但此当前值并非GTM上的当前值,只是保存本节点与GTM交互后的状态。如果其他节点也向GTM申请了新值,或者调用了Setval修改了序列的状态,不会刷新本节点的单行表,但因每次申请序列值是向GTM申请,所以对序列正确性没有影响。
  • 创建序列 方法一: 声明字段类型为序列整型来定义标识符字段。例如: 1 2 3 4 5 CREATE TABLE T1 ( id serial, name text ); 方法二: 创建序列,并通过nextval('sequence_name')函数指定为某一字段的默认值。这种方式更灵活,可以为序列定义cache,一次预申请多个序列值,减少与GTM的交互次数,来提高性能。 创建序列 1 CREATE SEQUENCE seq1 cache 100; 指定为某一字段的默认值,使该字段具有唯一标识属性。 1 2 3 4 5 CREATE TABLE T2 ( id int not null default nextval('seq1'), name text ); 除了为序列指定了cache,方法二所实现的功能基本与方法一类似。但是一旦定义cache,序列将会产生空洞(序列值为不连贯的数值,如:1.4.5),并且不能保序。另外为某序列指定从属列后,该列删除,对应的sequence也会被删除。 虽然数据库并不限制序列只能为一列产生默认值,但最好不要多列共用同一个序列。 当前版本只支持在定义表的时候指定自增列,或者指定某列的默认值为nextval('seqname'), 不支持在已有表中增加自增列或者增加默认值为nextval('seqname')的列。
  • 修改一个序列 ALTER SEQUENCE命令更改现有序列的属性,包括修改拥有者、归属列和最大值。 指定序列与列的归属关系。 将序列和一个表的指定字段进行关联。在删除那个字段或其所在表的时候会自动删除已关联的序列。 1 ALTER SEQUENCE seq1 OWNED BY T2.id; 将序列serial的最大值修改为300: 1 ALTER SEQUENCE seq1 MAXVALUE 300;
  • MERGE MERGE是ANSI标准的SQL语法操作符,用于从一个或多个来源中选择行来更新或插入到表或视图中,可以指定更新或插入到目标表或视图的条件。 输入:MERGE 1 2 3 4 5 6 7 8 MERGE INTO tab1 A using ( SELECT c1, c2, ... FROM tab2 WHERE ...) AS B ON A.c1 = B.c1 WHEN MATCHED THEN UPDATE SET c2 = c2 , c3 = c3 WHEN NOT MATCHED THEN INSERT VALUES (B.c1, B.c2, B.c3); 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 WITH B AS ( SELECT c1 ,c2 ,... FROM tab2 WHERE ... ) ,UPD_REC AS ( UPDATE tab1 A SET c2 = c2 ,c3 = c3 FROM B WHERE A.c1 = B.c1 returning A. * ) INSERT INTO tab1 SELECT B.c1 ,B.c2 ,B.c3 FROM B WHERE NOT EXISTS ( SELECT 1 FROM UPD_REC A WHERE A.c1 = B.c1 ) ; 父主题: 数据操作语句(DML)
  • MySQL配置 设置MySQL配置参数可在迁移MySQL数据库脚本时自定义迁移工具的行为。 打开config文件夹中的features-mysql.properties文件,并根据实际需要设置features-mysql.properties文件中的配置参数中的参数。 表1 features-mysql.properties文件中的配置参数 参数 说明 取值范围 默认值 样例 table.databaseAsSchema table.defaultSchema 是否使用数据库名称作为schema名称,如果数据库名称不存在,则使用用户定义schema, 如果用户定义schema为空,则使用默认schema。 true false public true public table.databaseAsSchema=true table.defaultSchema=public table.schema 用户设置的schema名称,如果该参数不为空,则使用该参数,即使包含useDatabaseAsSchema = true,也会使用当前schema名称。 schemaName 默认为空 table.schema= table.orientation 默认数据存储方式,ROW:行存储,COLUMN:列存储。 ROW COLUMN ROW table.orientation=ROW table.type 默认的表类型,分区表、复制表、round-robin表, REPLICATION, HASH, ROUND-ROBIN。 HASH REPLICATION ROUND-ROBIN HASH table.type=HASH table.tablespace 表空间选项。 COMMENT RESERVE RESERVE table.tablespace=RESERVE table.partition-key.choose.strategy 分区键选择策略。 partitionKeyChooserStrategy partitionKeyChooserStrategy table.partition-key.choose.strategy=partitionKeyChooserStrategy table.partition-key.name 分区键设置,如果为空,则按照默认策略选择,如果有多列,用逗号分隔,忽略列名称大小写。 预留参数 默认为空 table.partition-key.name= table.compress.mode 创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 COMPRESS NOCOMPRESS NOCOMPRESS table.compress.mode=NOCOMPRESS table.compress.row table.compress.column 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。 YES NO YES NO LOW MIDDLE HIGH NO LOW table.compress.row=NO table.compress.column=LOW table.compress.level 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。 0 1 2 3 0 table.compress.level=0 table.database.template 数据库模板。 预留参数 template0 table.database.template=template0 table.database.encoding A database code. UTF8 SQL_ASCII GBK Latin1 codes UTF8 table.database.encoding=UTF8 table.index.rename 创建索引时,是否重新命名索引名 true false false table.index.rename=false table.database.onlyFullGroupBy select后非聚合列是否全部出现在group by中 true false true table.database.onlyFullGroupBy=true table.database.realAsFloat REAL数据类型转换使用,默认false,转换为DOUBLE PRECISION; 改为true时,转换为REAL true false false table.database.realAsFloat=false 父主题: 配置DSC
  • RENAME 重命名表名 MySQL重命名表名的语句与GaussDB(DWS)有一些差异。DSC工具迁移时会根据GaussDB(DWS)的特性进行相应适配。 工具暂不支持原表名附有DATABASE(SCHEMA)的场景。 MySQL通过RENAME TABLE语句修改表名 输入示例 1 2 3 4 5 # 单表重命名 RENAME TABLE DEPARTMENT TO NEWDEPT; # 多表重命名 RENAME TABLE NEWDEPT TO NEWDEPT_02,PEOPLE TO PEOPLE_02; 输出示例 1 2 3 4 5 6 --单表重命名 ALTER TABLE "public"."department" RENAME TO "newdept"; --多表重命名 ALTER TABLE "public"."newdept" RENAME TO "newdept_02"; ALTER TABLE "public"."people" RENAME TO "people_02"; MySQL通过ALTER TABLE RENAME 语句修改表名,DSC工具迁移该语句时会将 "AS" 关键字迁移为 "TO"。 输入示例 1 2 3 4 5 ## A. ALTER TABLE runoob_alter_test RENAME TO runoob_alter_testnew; ## B. ALTER TABLE runoob_alter_testnew RENAME AS runoob_alter_testnewnew; 输出示例 1 2 3 4 5 -- A. ALTER TABLE "public"."runoob_alter_test" RENAME TO "runoob_alter_testnew"; -- B. ALTER TABLE "public"."runoob_alter_testnew" RENAME TO "runoob_alter_testnewnew"; 父主题: 表(可选参数、操作)
  • 对已有的表进行分区 表只能在创建时被分区。 如果用户有一个表想要分区,用户必须创建一个分过区的表,把原始表的数据载入到新表,再删除原始表并且把分过区的表重命名为原始表的名称。 用户还必须重新授权表上的权限。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE web_returns_p2 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(20161231) END(20191231) EVERY(10000), PARTITION p0 END(maxvalue) ); 1 2 3 4 5 INSERT INTO web_returns_p2 SELECT * FROM web_returns_p1; DROP TABLE web_returns_p1; ALTER TABLE web_returns_p2 RENAME TO web_returns_p1; GRANT ALL PRIVILEGES ON web_returns_p1 TO dbadmin; GRANT SELECT ON web_returns_p1 TO jack;
  • 分割一个分区 范围分区表和列表分区表分割分语法有所区别: 使用ALTER TABLE语句为范围分区表分割一个分区。例如,将表web_returns_p1分区pxxxx以20201231为分割点分割为p2020和p20xx两个分区。 1 ALTER TABLE web_returns_p1 SPLIT PARTITION pxxxx AT(20201231) INTO (PARTITION p2020,PARTITION p20xx); 使用ALTER TABLE语句为列表分区表分割一个分区。例如,将表sales_info分区province2_202201分割为province3_202201和province4_202201两个分区。 1 ALTER TABLE sales_info SPLIT PARTITION province2_202201 VALUES(('202201', 'city5')) INTO (PARTITION province3_202201,PARTITION province4_202201);
  • 查询分区 查询分区p2019。 1 2 SELECT * FROM web_returns_p1 PARTITION (p2019); SELECT * FROM web_returns_p1 PARTITION FOR (20201231); 查看分区表信息,可使用系统表dba_tab_partitions。 1 SELECT * FROM dba_tab_partitions where table_name='web_returns_p1';
  • 分区策略选择 当表有以下特征时,可以考虑使用表分区策略: 数据具有明显区间性的字段。 分区表需要根据有明显区间性字段进行表分区。比如按照日期、区域、数值等字段进行分区,时间字段是最常见的分区字段。 业务查询有明显的区间范围特征。 查询数据可落到区间范围指定的分区内,这样才能通过分区剪枝,只扫描查询需要的分区,从而提升数据扫描效率,降低数据扫描的IO开销。 表数据量比较大。 小表扫描本身耗时不大,分区表的性能收益不明显,因此只建议对大表采取分区策略。列存储模式下因为每个列是单独的文件存储,且最小的存储单元CU可存储6w行数据,因此对于列存分区表,建议每个分区的数据不小于DN个数*6w。
  • 创建范围(range)分区表 示例:创建一个按wr_returned_date_sk范围分区的表web_returns_p1。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE web_returns_p1 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE (wr_returned_date_sk) ( PARTITION p2016 VALUES LESS THAN(20161231), PARTITION p2017 VALUES LESS THAN(20171231), PARTITION p2018 VALUES LESS THAN(20181231), PARTITION p2019 VALUES LESS THAN(20191231), PARTITION pxxxx VALUES LESS THAN(maxvalue) ); 对于分区间隔固定、批量创建分区的场景。可使用如下示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE web_returns_p2 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(20161231) END(20191231) EVERY(10000), PARTITION p0 END(maxvalue) );
  • 创建列表(list)分区表 LIST分区表可以使用任意允许值比较的列作为分区键列。创建LIST分区表时,必须要为每一个分区声明每一个值分区。 示例:创建LIST分区表sales_info。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE sales_info ( sale_time timestamptz, period int, city text, price numeric(10,2), remark varchar2(100) ) DISTRIBUTE BY HASH(sale_time) PARTITION BY LIST (period, city) ( PARTITION province1_202201 VALUES (('202201', 'city1'), ('202201', 'city2')), PARTITION province2_202201 VALUES (('202201', 'city3'), ('202201', 'city4'), ('202201', 'city5')), PARTITION rest VALUES (DEFAULT) );
  • 定义分区 下表列出了各分区类型表支持的字段/选项: 表3 支持的字段/选项 字段/选项名 行分区 列分区 ORC分区 分区类型 按范围 按范围 按值 分区名 √ √ x 分区值 √ √ x 在“一般”页签中,如果“表存储方式”选择为“ROW”或“COLUMN”,则“分区类型”区域会显示“By Range”。如果“表存储方式”选择为“ORC”,则“分区类型”区域会显示“By Values”。 从“可用列”区域选择用于定义分区的列,单击“右向箭头”按钮,该列会移动到“分区列”区域。 如果“表存储方式”选择为“ROW”或“COLUMN”,则仅能选择一列用于分区。 如果“表存储方式”选择为“ORC”,则最多可选择四列用于分区。 最多可选择4列用于定义分区。 在“分区名称”中输入分区的名称。 单击“分区值”旁的“单击输入分区值”按钮,在“值”列中输入要对表进行分区的值,单击“确定”。 输入分区的所有信息后,单击“添加”。 支持对分区进行添加、删除、编辑、调整顺序等操作。 根据表中的要求更改分区顺序。要更改顺序,请选择所需的分区,然后单击“向上”或“向下”。 定义所有分区后,单击“下一步”。
  • PG_JOB PG_JOB视图存储用户创建的定时任务的任务详细信息。 PG_JOB视图用于代替历史版本的PG_JOB系统表,提供对之前版本的前向兼容。原PG_JOB系统表已经变更为PG_JOBS系统表,关于PG_JOBS系统表的描述详见PG_JOBS。 表1 PG_JOB字段 名字 类型 描述 job_id bigint 作业ID。 current_postgres_pid bigint 如果当前任务正在被执行,那么此处记录运行此任务的postgres线程ID。默认为-1,表示此任务未被执行或已执行完毕。 log_user name 创建者的UserName。 priv_user name 作业执行者的UserName。 dbname name 标识作业执行的数据库名。 node_name name 标识当前作业是在哪个CN上创建和执行。 job_status text 当前任务的执行状态,取值范围:('r', 's', 'f', 'd','p','w','l'),默认为's',取值含义: r=running s=successfully finished f=job failed d=disable p=pending w=waiting l=launching 说明: 当用户将定时任务关闭(即job_queue_processes为0时),由于监控job执行的线程不会启动,所以job_status不会根据job的实时状态进行设置,用户不需要关注job_status。 只有当开启定时任务功能(job_queue_processes为非0时),系统才会根据当前job的实时状态刷新job_status的值。 其中,当前任务的执行状态“p,w,l”仅8.3.0.100及以上集群版本支持。 start_date timestamp without time zone 作业第一次开始执行时间,时间精确到毫秒。 next_run_date timestamp without time zone 下次定时执行任务的时间,时间精确到毫秒。 failure_count smallint 连续失败计数。 interval text 作业执行的重复时间间隔。 last_start_date timestamp without time zone 上次运行开始时间,时间精确到毫秒。 last_end_date timestamp without time zone 上次运行的结束时间,时间精确到毫秒。 last_suc_date timestamp without time zone 上次成功运行的开始时间,时间精确到毫秒。 this_run_date timestamp without time zone 正在运行任务的开始时间,时间精确到毫秒。 nspname name 作业运行时所在的命名空间的名称。 what text 作业内容。 父主题: 系统视图
  • VALUES MySQL REPLACE支持一条语句插入或删除多值,以逗号分隔。 输入 1 2 3 4 5 #有数据的话则替换replace,没有的话则插入新的数据同INSERT Replace INTO exmp_tb1 (tb1_id,tb1_name,tb1_sex,tb1_address,tb1_number) VALUES(17,'David','male','NewYork11','01015827875'),(18,'Rachel','female','NewYork22','01015827749'),(20,'Monica','female','NewYork','010158996743'); Replace INTO exmp_tb1 (tb1_id,tb1_name,tb1_sex,tb1_address,tb1_number) VALUES(17,'David1','male','NewYork11','01015827875'),(21,'Rachel','female','NewYork22','01015827749'),(22,'Monica','female','NewYork','010158996743'); Replace INTO exmp_tb1 (tb1_id,tb1_name,tb1_sex,tb1_address,tb1_number,tb1_date) VALUES(17,'David2',DEFAULT,'NewYork11','01015827875',DEFAULT),(18,'Rachel','female',DEFAULT,'01015827749','2018-12-14 10:44:20'),(DEFAULT,'Monica','female',DEFAULT,DEFAULT,'2018-12-14 10:44:20'); Replace INTO exmp_tb1 VALUES(DEFAULT,'David',DEFAULT,'NewYork11','01015827875',DEFAULT),(18,'Rachel','female',DEFAULT,'01015827749','2018-12-14 10:44:20'),(DEFAULT,'Monica','female',DEFAULT,DEFAULT,'2018-12-14 10:44:20'); 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 --有数据的话则替换replace,没有的话则插入新的数据同INSERT INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (17,'David','male','NewYork11','01015827875'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (18,'Rachel','female','NewYork22','01015827749'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (20,'Monica','female','NewYork','010158996743'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (17,'David1','male','NewYork11','01015827875'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (21,'Rachel','female','NewYork22','01015827749'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number") VALUES (22,'Monica','female','NewYork','010158996743'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number","tb1_date") VALUES (17,'David2',DEFAULT,'NewYork11','01015827875',DEFAULT); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number","tb1_date") VALUES (18,'Rachel','female',DEFAULT,'01015827749','2018-12-14 10:44:20'); INSERT INTO "public"."exmp_tb1" ("tb1_id","tb1_name","tb1_sex","tb1_address","tb1_number","tb1_date") VALUES (DEFAULT,'Monica','female',DEFAULT,DEFAULT,'2018-12-14 10:44:20'); INSERT INTO "public"."exmp_tb1" VALUES (DEFAULT,'David',DEFAULT,'NewYork11','01015827875',DEFAULT); INSERT INTO "public"."exmp_tb1" VALUES (18,'Rachel','female',DEFAULT,'01015827749','2018-12-14 10:44:20'); INSERT INTO "public"."exmp_tb1" VALUES (DEFAULT,'Monica','female',DEFAULT,DEFAULT,'2018-12-14 10:44:20'); 父主题: REPLACE
  • NOTNULL and ISNULL Netezza语法 迁移后语法 1 CASE WHEN ((A1.EXCEPT_OFF_SEQU_NO NOTNULL) AND (A2.LOG_SEQU_NO ISNULL)) THEN 0 ELSE 1 END AS FLG 1 CASE WHEN ((A1.EXCEPT_OFF_SEQU_NO NOTNULL) AND (A2.LOG_SEQU_NO ISNULL)) THEN 0 ELSE 1 END AS FLG
  • INTERVAL MySQL中使用interval表达式格式为INTERVAL N时间单位,DWS不支持,需要转换为INTERVAL 'N'时间单位。 输入示例 1 2 3 4 5 6 SELECT CURRENT_TIME() - INTERVAL 4 DAY; SELECT NOW() - INTERVAL 5 HOUR; SELECT CURRENT_TIME() - INTERVAL '4' DAY; SELECT NOW() - INTERVAL '5' HOUR; SELECT CURRENT_TIME() - INTERVAL "4" DAY; SELECT NOW() - INTERVAL "5" HOUR; 输出示例 1 2 3 4 5 6 SELECT (CURRENT_TIME () - INTERVAL '4' DAY); SELECT (NOW () - INTERVAL '5' HOUR); SELECT (CURRENT_TIME () - INTERVAL '4' DAY); SELECT (NOW () - INTERVAL '5' HOUR); SELECT (CURRENT_TIME () - INTERVAL '4' DAY); SELECT (NOW () - INTERVAL '5' HOUR); 父主题: SELECT
共100000条