云服务器内容精选

  • 示例 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 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建表tpcds.reason。 gaussdb=# CREATE TABLE tpcds.reason (c1 int, c2 int); --以默认方式启动事务。 gaussdb=# START TRANSACTION; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# END; --以默认方式启动事务。 gaussdb=# BEGIN; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# END; --以隔离级别为READ COMMITTED,读/写方式启动事务。 gaussdb=# START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# COMMIT; --删除表。 gaussdb=# DROP TABLE tpcds.reason; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 语法格式 格式一:START TRANSACTION格式 1 2 3 4 START TRANSACTION [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [ ...] ]; 格式二:BEGIN格式 1 2 3 4 5 6 7 BEGIN [ WORK | TRANSACTION ] [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [ ...] ];
  • 参数说明 WORK | TRANSACTION BEGIN格式中的可选关键字,没有实际作用。 ISOLATION LEVEL 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 在事务中第一个数据修改语句(INSERT、DELETE、UPDATE、FETCH、COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 SERIALIZABLE: GaussDB 目前功能上不支持此隔离级别,设置该隔离级别时,等价于REPEATABLE READ。 READ WRITE | READ ONLY 指定事务访问模式(读/写或者只读)。
  • 二进制类型 GaussDB支持的二进制类型如表1所示。 表1 二进制类型 名称 描述 存储空间 BLOB 二进制大对象。 目前BLOB支持的外部存取接口仅为: DBE_LOB.GET_LENGTH DBE_LOB.READ DBE_LOB.WRITE DBE_LOB.WRITE_APPEND DBE_LOB.COPY DBE_LOB.ERASE 这些接口详细说明请参见DBE_LOB。 在ustore下,最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此BLOB类型最大值可能小于1GB-1。 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'时,BLOB类型映射为BYTEA类型,别名为BYTEA。 具体存储规格参考BYTEA类型。 TINYBLOB MEDIUMBLOB LONGBLOB 二进制大对象。 具体存储规格参考BYTEA类型。 只有当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'时,可以使用此类型,类型映射为BYTEA类型,别名为BYTEA。 RAW 变长的十六进制类型。 4字节加上实际的二进制字符串。最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此类型最大值可能小于1GB-1。 BYTEA 变长的二进制字符串。 4字节加上实际的二进制字符串。最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此类型最大值可能小于1GB-1。 BYTEAWITHOUTORDERWITHEQUALCOL 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为确定性加密,则该列的实际类型为BYTEAWITHOUTORDERWITHEQUALCOL),元命令打印加密表将显示原始数据类型。 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 BYTEAWITHOUTORDERCOL 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为随机加密,则该列的实际类型为BYTEAWITHOUTORDERCOL),元命令打印加密表将显示原始数据类型。 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 _BYTEAWITHOUTORDERWITHEQUALCOL 变长的二进制字符串,密态特性新增的类型。 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 _BYTEAWITHOUTORDERCOL 变长的二进制字符串,密态特性新增的类型。 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 除了每列的大小限制以外,每个元组的总大小也不可超过1GB-1字节。 不支持直接使用BYTEAWITHOUTORDERWITHEQUALCOL、BYTEAWITHOUTORDERCOL、_BYTEAWITHOUTORDERWITHEQUALCOL和_BYTEAWITHOUTORDERCOL类型创建表。 RAW(n),n是指字节长度建议值,不会用于校验输入RAW类型的字节长度。 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB类型的表现规格为BYTEA类型,如查询表结构显示为BYTEA类型。 示例: 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 40 41 42 43 44 45 46 --创建表。 gaussdb=# CREATE TABLE blob_type_t1 ( BT_COL1 INTEGER, BT_COL2 BLOB, BT_COL3 RAW, BT_COL4 BYTEA ) DISTRIBUTE BY REPLICATION; --插入数据。 gaussdb=# INSERT INTO blob_type_t1 VALUES(10,empty_blob(), HEXTORAW('DEADBEEF'),E'\\xDEADBEEF'); --查询表中的数据。 gaussdb=# SELECT * FROM blob_type_t1; bt_col1 | bt_col2 | bt_col3 | bt_col4 ---------+---------+----------+------------ 10 | | DEADBEEF | \xdeadbeef (1 row) --删除表。 gaussdb=# DROP TABLE blob_type_t1; --示例:TINYBLOB MEDIUMBLOB LONGBLOB二进制大对象类型。 gaussdb=# CREATE DATABASE gaussdb_m WITH dbcompatibility 'MYSQL'; gaussdb=# \c gaussdb_m --设置兼容版本控制参数。 gaussdb_m=# SET b_format_version='5.7'; gaussdb_m=# SET b_format_dev_version='s1'; --创建表。 gaussdb_m=# CREATE TABLE t1(num int, a tinyblob, b blob, m mediumblob, l longblob); --插入数据。 gaussdb_m=# INSERT INTO t1 VALUES (1, 'tinyblobtest', 'blobtest', 'mediumblobtest', 'longblobtest'); --查询表中数据。 gaussdb_m=# SELECT * FROM t1; num | a | b | m | l -----+--------------+----------+----------------+-------------- 1 | tinyblobtest | blobtest | mediumblobtest | longblobtest (1 row) --删除表和数据库。 gaussdb_m=# DROP TABLE t1; gaussdb_m=# \c postgres; gaussdb=# DROP DATABASE gaussdb_m; --重置参数。 gaussdb=# RESET ALL; 父主题: 数据类型
  • 参数说明 SESSION 声明这个命令只对当前会话起作用,此参数为缺省值。 LOCAL 声明该命令只在当前事务中有效。 role_name 角色名。 取值范围:字符串,数据库中已存在的用户名。 password 角色的密码。要求符合密码的命名规则。 使用密文密码限制如下: 管理员用户不能使用密文密码切换到其他管理员用户,只能向权限更低用户切换。 使用密文密码通常用于gs_dump、gs_dumpall导出场景,其他场景不建议直接使用密文密码。 RESET ROLE 用于重置当前用户标识。
  • 注意事项 当前会话的用户必须是指定的rolename角色的成员,当三权分立关闭时,系统管理员可以选择任何角色。 使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。如果会话用户的角色有INHERITS属性,则它自动拥有它能SET ROLE变成的角色的所有权限;在这种情况下,SET ROLE实际上是删除了所有直接赋予会话用户的权限,以及它的所属角色的权限,只剩下指定角色的权限。另一方面,如果会话用户的角色有NOINHERITS属性,SET ROLE删除直接赋予会话用户的权限,而获取指定角色的权限。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 --创建安全标签。 gaussdb=# CREATE SECURITY LABEL sec_label 'L1:G4'; --创建表 gaussdb=# CREATE TABLE tbl(c1 int, c2 int); --创建用户 gaussdb=# CREATE USER bob WITH PASSWORD '********'; --给用户应用安全标签。 gaussdb=# SECURITY LABEL ON ROLE bob IS 'sec_label'; --给表应用安全标签。 gaussdb=# SECURITY LABEL ON TABLE tbl IS 'sec_label'; --给表的列应用安全标签。 gaussdb=# SECURITY LABEL ON COLUMN tbl.c1 IS 'sec_label'; --给用户取消安全标签。 gaussdb=# SECURITY LABEL ON ROLE bob IS NULL; --给表取消安全标签。 gaussdb=# SECURITY LABEL ON TABLE tbl IS NULL; --给表的列取消安全标签。 gaussdb=# SECURITY LABEL ON COLUMN tbl.c1 IS NULL; --删除已存在的安全标签sec_label。 gaussdb=# DROP SECURITY LABEL sec_label; --删除表tb1。 gaussdb=# DROP TABLE tbl; --删除用户bob。 gaussdb=# DROP USER bob;
  • GUC参数设置 GaussDB提供了六类GUC参数,具体分类和设置方式请参考表1。 表1 GUC参数分类 参数类型 说明 设置方式 INTERNAL 固定参数,在创建数据库的时候确定,用户无法修改,只能通过show语法或者pg_settings视图进行查看。 无 POSTMASTER 数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。 支持表2中的方式一。 SIGHUP 数据库全局参数,可在数据库启动时设置或者在数据库启动后,发送指令重新加载。 支持表2中的方式一、方式二。 BACKEND 会话连接参数。在创建会话连接时指定,连接建立后无法修改。连接断掉后参数失效。内部使用参数,不推荐用户设置。 支持表2中的方式一、方式二。 说明: 设置该参数后,下一次建立会话连接时生效。 SUSET 数据库管理员参数。可在数据库启动时、数据库启动后或者数据库管理员通过SQL进行设置。 支持表2中的方式一、方式二或由数据库管理员通过方式三设置。 USERSET 普通用户参数。可被任何用户在任何时刻设置。 支持表2中的方式一、方式二或方式三设置。 说明: 设置USERSET类型的参数时,ALTER DATABASE设置的参数值优先级高于gs_guc设置。如果想要gs_guc设置的参数值生效,则需要执行“alter database xxx reset xxx”进行重置。 GaussDB提供了三种方式来修改GUC参数,具体操作请参考表2: 表2 GUC参数设置方式 序号 设置方法 方式一 使用如下命令修改参数。 gs_guc set -Z nodetype -D datadir -c "paraname=value" 说明: 如果参数是一个字符串变量,则使用-c parameter="'value'"或者使用-c "parameter = 'value'"。 当参数是一个字符串变量,gs_guc工具不会进行合法性校验,如果配置参数不合法导致数据库运行异常,可以查看gs_log日志进行问题排查。 使用以下命令在CN和DN上同时设置某个参数。 gs_guc set -Z coordinator -Z datanode -N all -I all -c "paraname=value" 使用以下命令在CN和DN上设置cm_agent某个参数。 gs_guc set -Z cmagent -c "paraname=value" gs_guc set -Z cmagent -N all -I all -c "paraname=value" 使用以下命令在CN和DN上设置cm_server某个参数。 gs_guc set -Z cmserver -c "paraname=value" gs_guc set -Z cmserver -N all -I all -c "paraname=value" 重启数据库使参数生效。 说明: 重启集群操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。 gs_om -t stop && gs_om -t start 方式二 gs_guc reload -Z nodetype -D datadir -c "paraname=value" 说明: 使用以下命令在CN和DN上同时设置某个参数。 gs_guc reload -Z coordinator -Z datanode -N all -I all -c "paraname=value" 使用以下命令在CN和DN上设置cm_agent某个参数。 gs_guc reload -Z cmagent -N all -I all -c "paraname=value" gs_guc reload -Z cmagent -c "paraname=value" 使用以下命令在CN和DN上设置cm_server某个参数。 gs_guc reload -Z cmserver -N all -I all -c "paraname=value" gs_guc reload -Z cmserver -c "paraname=value" 方式三 修改会话级别的参数。 设置会话级别的参数 1 gaussdb=# SET paraname TO value; 修改本次会话中的取值。退出会话后,设置将失效。 使用方式一和方式二设置参数时,若所设参数不属于当前节点,数据库会提示参数不在支持范围内的相关信息。 使用方式三设置参数时,若参数值为int整型,则会将整数前导零过滤掉,例如SET paraname TO 008192与SET paraname TO 8192效果相同。
  • 背景信息 GaussDB提供了多种修改GUC参数的方法,用户可以方便的针对数据库、用户、会话进行设置。 参数名称不区分大小写。 参数取值有整型、浮点型、字符串、布尔型和枚举型五类。 布尔值可以是(on,off)、(true,false)、(yes,no)或者(1,0),且不区分大小写。 枚举类型的取值是系统表pg_settings的enumvals字段取值定义的。 对于有单位的参数,在设置时请指定单位,否则将使用默认的单位。 参数的默认单位是系统表pg_settings的unit字段定义的。 内存单位有:KB(千字节)、MB(兆字节)和GB(吉字节)。 时间单位:ms(毫秒)、s(秒)、min(分钟)、h(小时)和d(天)。 CN和DN参数可以同时进行设置,其他类型的参数不能同时进行设置。 具体参数说明请参见GUC参数说明。
  • 获取结果集中的数据 ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据常用的方法如表4所示,其他方法请参考JDK官方文档。 表4 ResultSet对象的常用方法 方法 描述 int getInt(int columnIndex) 按列标获取int型数据。 int getInt(String columnLabel) 按列名获取int型数据。 String getString(int columnIndex) 按列标获取String型数据。 String getString(String columnLabel) 按列名获取String型数据。 Date getDate(int columnIndex) 按列标获取Date型数据。 Date getDate(String columnLabel) 按列名获取Date型数据。
  • 在结果集中定位 ResultSet对象具有指向其当前数据行的光标。最初,光标被置于第一行之前,next方法将光标移动到下一行。因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。但对于可滚动的结果集,JDBC驱动程序提供更多的定位方法,使ResultSet指向特定的行。定位方法如表2所示。 表2 在结果集中定位的方法 方法 描述 next() 把ResultSet向下移动一行。 previous() 把ResultSet向上移动一行。 beforeFirst() 把ResultSet定位到第一行之前。 afterLast() 把ResultSet定位到最后一行之后。 first() 把ResultSet定位到第一行。 last() 把ResultSet定位到最后一行。 absolute(int) 把ResultSet移动到参数指定的行数。 relative(int) 通过设置为1向前(设置为1,相当于next())或者向后(设置为-1,相当于previous())移动参数指定的行。
  • 获取结果集中光标的位置 对于可滚动的结果集,可调用定位方法来改变光标的位置。JDBC驱动程序提供了获取结果集中光标所处位置的方法。获取光标位置的方法如表3所示。 表3 获取结果集光标的位置 方法 描述 isFirst() 是否在第一行。 isLast() 是否在最后一行。 isBeforeFirst() 是否在第一行之前。 isAfterLast() 是否在最后一行之后。 getRow() 获取当前在第几行。
  • 设置结果集类型 不同类型的结果集有各自的应用场景,应用程序需要根据实际情况选择相应的结果集类型。在执行SQL语句过程中,需要先创建相应的语句对象,而部分创建语句对象的方法提供了设置结果集类型的功能。具体的参数设置如表1所示。涉及的Connection的方法如下: 1 2 3 4 5 6 7 8 //创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 createStatement(int resultSetType, int resultSetConcurrency); //创建一个PreparedStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 prepareStatement(String sql, int resultSetType, int resultSetConcurrency); //创建一个CallableStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 prepareCall(String sql, int resultSetType, int resultSetConcurrency); 表1 结果集类型 参数 描述 resultSetType 表示结果集的类型,具体有三种类型: ResultSet.TYPE_FORWARD_ONLY:ResultSet只能向前移动。是缺省值。 ResultSet.TYPE_SCROLL_SENSITIVE:在修改后重新滚动到修改所在行,可以看到修改后的结果。 ResultSet.TYPE_SCROLL_INSENSITIVE:对可修改例程所做的编辑不进行显示。 说明: 结果集从数据库中读取了数据之后,即使类型是ResultSet.TYPE_SCROLL_SENSITIVE,也不会看到由其他事务在这之后引起的改变。调用ResultSet的refreshRow()方法,可进入数据库并从其中取得当前游标所指记录的最新数据。 resultSetConcurrency 表示结果集的并发,具体有两种类型: ResultSet.CONCUR_READ_ONLY:如果不从结果集中的数据建立一个新的更新语句,不能对结果集中的数据进行更新。 ResultSet.CONCUR_UPDATEABLE:可改变的结果集。对于可滚动的结果集,可对结果集进行适当的改变。
  • 优化说明 此优化的核心就是消除子查询。分析业务场景发现a.ca_address_sk不为NULL,那么从SQL语义出发,可以等价改写SQL为: 1 2 3 4 5 select count(*) from customer_address_001 a4, customer_address_001 a where a4.ca_address_sk = a.ca_address_sk group by a.ca_address_sk; 为了保证改写的等效性,在customer_address_001. ca_address_sk加了not null约束。
  • 参数说明 OR REPLACE 当存在同名的存储过程时,替换原来的定义。 procedure_name 创建的存储过程名称,可以带有模式名。 取值范围:字符串,要符合标识符命名规范。 建议不要创建和系统函数重名的函数,否则调用时需要指定函数的schema。 argmode 参数的模式。 VARIADIC用于声明数组类型的参数。 取值范围: IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的过程定义中。 argname 参数的名称。 取值范围:字符串,要符合标识符命名规范。 argtype 参数的数据类型。可以使用%ROWTYPE间接引用表的类型,或者使用%TYPE间接引用表或复合类型中某一列的类型。 取值范围:可用的数据类型。 expression 参数的默认表达式。 在参数a_format_version值为10c和a_format_dev_version值为s2的情况下,参数为INOUT模式时不支持默认表达式。 推荐使用方式:将所有默认值参数定义在所有非默认值参数后。 调用带有默认参数的函数时,入参从左往右排入函数,如果有非默认参数的入参缺失则报错。 打开 proc_uncheck_default_param 参数,调用带有默认参数的函数时,入参从左往右排入函数,允许缺省默认参数个入参,如果有非默认参数的入参缺失,则会用错位的默认值填充该参数。 在参数a_format_version值为10c、a_format_dev_version值为s1和关闭proc_outparam_override,函数参数同时包括out出参和default时,默认值不可缺省。 IMMUTABLE、STABLE等 行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见CREATE FUNCTION plsql_body PL/SQL存储过程体。 当在存储过程体中进行创建用户、修改密码或加解密等涉及密码或密钥相关操作时,系统表及日志中会记录密码或密钥的明文信息。为防止敏感信息泄露,不建议用户在存储过程体中进行涉及密码或密钥等敏感信息的相关操作。 argname和argmode的顺序没有严格要求,推荐按照argname、argmode、argtype的顺序使用。