云服务器内容精选

  • 异常处理原则 任何在PL/pgSQL函数中发生的错误会中止该函数的执行,而且实际上会中止其周围的事务。你可以使用一个带有EXCEPTION子句的BEGIN块俘获错误并且从中恢复。 在使用PL/PGSQL块中,如果使用了不能返回确定结果的SQL语句,宜在EXCEPTION中对程序可能出现的异常进行处理,避免出现未处理的出错被传递到外层块,导致程序逻辑错误。 对于系统已经定义了的异常,可以直接使用。DWS暂不支持自定义异常。 进入和退出一个包含EXCEPTION子句的块要比不包含的块开销大的多。因此,非必要场景不应使用EXCEPTION。
  • 书写规范 变量命名规则: 过程、函数的输入参数格式宜为:IN_参数名,参数名宜使用大写。 过程、函数的输出参数格式宜为:OUT_参数名,参数名宜使用大写。 过程、函数的输入输出参数格式宜为:IO_参数名,参数名宜使用大写。 过程、函数的程序中用到的变量宜由v_变量名组成,变量名宜使用小写。 将查询语句做成字符串拼接时,where语句的拼接变量名宜统一为v_where,select语句的拼接变量名宜为v_select。 记录(RECORD)的类型(TYPE)命名宜由T+变量名组成,名称宜使用大写。 游标命名宜由CUR+变量名组成,名称宜使用大写。 引用游标(REF CURSOR)的命名宜由REF+变量名组成,名称宜使用大写。 变量类型定义: 变量类型声明时,如果其含义和应用表某字段含义相同时,应使用%TYPE声明。 记录类型声明时,如果其含义和某应用表行数据相同时,应使用%ROWTYPE声明。 注释规范: 注释应该是有意义的,而不应是重述代码。 注释应简洁、易懂,以中文为主。为了表达准确,名词或操作上也可以使用英文。 应在每个存储过程、函数得开始加入注释,内容应包括:本程序的简要功能描述、编写者、编写日期、程序版本号信息和程序变更信息,而且各存储过程开头注释应保持统一格式。 应在输入输出参数的旁边添加注释,注明次变量的意义。 每个块或大分支的开始宜添加注释,描述块的简要功能,若使用算法,宜添加注释简单描述算法的目的和结果。 变量声明格式: 每行应只包含一条语句,如同时需要赋初始值,应在同一行书写。 大小写规范: 除了变量名,应一律使用大写。 缩进规范: 创建存储过程语句中,同一层的CREATE、AS/IS、BEGIN、END这几个关键字应位于同一列,其他部分依次缩进。 语句详述: 变量定义语句。每行应只包含一条语句。 同一层的IF、ELSEIF、ELSE和END关键字应开始于同一列,执行语句缩进。 CASE和END关键字应位于同一列,WHEN和ELSE关键字应缩进。 同一层的LOOP和END LOOP关键字应位于同一列,层内语句或嵌套应依次缩进。
  • 总体开发原则 应完全按照设计文档进行开发。 程序模块应做到高内聚低耦合。 应有正确、全面的故障对策。 程序编写应做到结构合理,条理清晰。 程序名称命名应按照统一的命名规则进行命名。 应充分考虑程序的运行效率,包括程序的执行效率和数据库的查询、存储效率,在保证应用的同时应使用效率高的处理方法。 程序注释应详细、正确、规范。 除非应用特别需要控制commit和rollback的提交时机,否则应在存储过程结束时执行显式的commit或者rollback操作。 程序处理应支持7*24小时;对于中断,应用程序应提供安全、简单的断点再续处理。 应提供标准、简单的应用输出,为应用维护人员提供明确的进度显示、错误描述和运行结果;为业务人员提供明确、直观的报表、凭证输出。
  • 程序编写原则 在PL/PGSQL中的SQL语句宜使用绑定变量。 在PL/PGSQL中的SQL语句宜使用RETURNING子句。 存储过程使用原则: 对于单个存储过程中Varchar或者Varchar2类型输出参数个数不应超过50个。 不应使用long类型作为输入或输出参数。 对于大小超过10MB的字符串类型输出,应使用CLOB类型。 变量声明原则: 变量声明时,如果含义和应用表某字段含义或某变量相同时,应使用%TYPE声明。 记录声明时,如果含义和某应用表行数据相同时,应使用%ROWTYPE声明。 变量声明每行应只包含一条语句。 不应声明LONG类型的变量。 游标使用类型: 显式游标使用后应关闭。 游标变量使用后应关闭,若游标变量需要传递数据给调用的应用程序,应在应用程序中进行游标关闭处理;若游标变量仅在存储过程中使用,应显式关闭游标。 在使用DBMS_SQL.CLOSE_CURSOR关闭游标前,应使用DBMS_SQL.IS_OPEN判断游标是否已打开。 集合使用原则: 引用集合中的元素时宜使用FORALL语句,不宜使用FOR循环语句。 动态语句使用原则: 联机系统的交易程序不宜使用动态SQL。 PL/PGSQL中要实现DDL语句和系统控制命令,可使用动态SQL。 宜尽量使用变量绑定。 拼装SQL的使用原则: 拼装SQL宜使用绑定变量。 拼装SQL语句的条件如果有外部输入源,应对输入条件进行字符检查,防止攻击。 在PL/PGSQL脚本中,单行代码的长度,不宜超过2499字符。 Trigger使用原则: Trigger可用于实现差量数据日志等于业务处理无关的可用性设计场景。 不应使用Trigger实现业务处理相关功能。
  • 自定义外部函数(pgSQL/Java)使用 【关注】Java UDF可以实现一些java逻辑计算,禁止在Java UDF中封装业务。 【关注】禁止在Java函数中使用任何方式连接数据库,包括但不限于JDBC。 【关注】只能选择下表中的数据类型,不支持自定义类型、复杂数据类型(Java Array类及派生类)等: 【关注】不支持UDAF(用户定义聚合函数)、UDTF(用户自定义表生成函数)。 表1 PL/Java默认数据类型映射关系 GaussDB (DWS) Java BOOLEAN boolean "char" byte bytea byte[] SMALLINT short INTEGER int BIGINT long FLOAT4 float FLOAT8 double CHAR java.lang.String VARCHAR java.lang.String TEXT java.lang.String name java.lang.String DATE java.sql.Timestamp TIME java.sql.Time (stored value treated as local time) TIMETZ java.sql.Time TIMESTAMP java.sql.Timestamp TIMESTAMPTZ java.sql.Timestamp 父主题: 开发设计建议
  • 开发设计建议概述 本开发设计建议约定数据库建模和数据库应用程序开发过程中,应当遵守的设计规范。依据这些规范进行建模,能够更好的契合GaussDB(DWS)的分布式处理架构,输出更高效的业务SQL代码。 本开发设计建议中所陈述的“建议”和“关注”含义如下: 建议:用户应当遵守的设计规则。遵守这些规则,能够保证业务的高效运行;违反这些规则,将导致业务性能的大幅下降或某些业务逻辑错误。 关注:在业务开发过程中客户需要注意的细则。用于标识容易导致客户理解错误的知识点(实际上遵守SQL标准的SQL行为),或者程序中潜在的客户不易感知的默认行为。 父主题: 开发设计建议
  • 数据库对象命名 数据库对象命名需要满足约束:长度不超过63个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$、#。 【建议】避免使用保留或者非保留关键字命名数据库对象。 可以使用SELECT * FROM pg_get_keywords()查询GaussDB(DWS)的关键字,或者在《SQL语法参考》中“关键字”章节中查看。 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,GaussDB(DWS)中使用双引号将数据库对象名称括起来时表示对大小写敏感。数据库对象名称大小写敏感会使定位问题难度增加。 【建议】数据库对象命名风格务必保持统一。 增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。 数据库对象名称由字母、数字和下划线组成,并且不能由数字开头。建议使用多个单词组成,以下划线分割。 数据库对象名称最好能够望文知意,尽量避免使用自定义缩写(可以使用通用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英文词汇或汉语拼音,但规则应该在集群范围内保持一致。 变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前缀标明该变量的类型。 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区分该表是普通表、临时表还是非日志表: 普通表名按照数据集的业务含义命名。 临时表以“tmp_+后缀”命名。 非日志表以“ul_+后缀”命名。 外表以“f_+后缀”命名。 父主题: 开发设计建议
  • DDL 在GaussDB中,建议DDL(建表、COMMENT等)操作统一执行。在批处理作业中尽量避免DDL操作,避免大量并发事务对性能的影响。 在非日志表(unlogged table)使用完后,立即执行数据清理(TRUNCATE)操作。因为在异常场景下,GaussDB不保证非日志表(unlogged table)数据的安全性。 临时表和非日志表的存储方式建议和基表相同。 索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • 数据加载和卸载 在INSERT语句中显式设置插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行ANALYZE操作,防止统计信息不准确而导致的执行计划劣化。 如果要清理表中的所有数据,建议使用TRUNCATE TABLE方式,不要使用DELETE TABLE方式。DELETE TABLE方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • DDL 在GaussDB中,建议DDL(建表、COMMENT等)操作统一执行。在批处理作业中尽量避免DDL操作,避免大量并发事务对性能的影响。 在非日志表(unlogged table)使用完后,立即执行数据清理(TRUNCATE)操作。因为在异常场景下,GaussDB不保证非日志表(unlogged table)数据的安全性。 临时表和非日志表的存储方式建议和基表相同。 索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • 数据加载和卸载 在INSERT语句中显式设置插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行ANALYZE操作,防止统计信息不准确而导致的执行计划劣化。 如果要清理表中的所有数据,建议使用TRUNCATE TABLE方式,不要使用DELETE TABLE方式。DELETE TABLE方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • 程序编写原则 在PL/pgSQL中的SQL语句宜使用绑定变量。 在PL/pgSQL中的SQL语句宜使用RETURNING子句。 存储过程使用原则: 对于单个存储过程中varchar或者varchar2类型输出参数个数不应超过50个。 不应使用long类型作为输入或输出参数。 对于大小超过10MB的字符串类型输出,应使用CLOB类型。 变量声明原则: 变量声明时,如果含义和应用表某字段含义或某变量相同时,应使用%TYPE声明。 记录声明时,如果含义和某应用表行数据相同时,应使用%ROWTYPE声明。 变量声明每行应只包含一条语句。 不应声明LONG类型的变量。 游标使用类型: 显式游标使用后应关闭。 游标变量使用后应关闭。若游标变量需要传递数据给调用的应用程序,应在应用程序中关闭游标;若游标变量仅在存储过程中使用,应显式关闭游标。 在使用DBMS_SQL.CLOSE_CURSOR关闭游标前,应使用DBMS_SQL.IS_OPEN判断游标是否已打开。 集合使用原则:引用集合中的元素时宜使用FORALL语句,不宜使用FOR循环语句。 动态语句使用原则: 联机系统的交易程序不宜使用动态SQL。 PL/pgSQL中要实现DDL语句和系统控制命令,可使用动态SQL。 尽量使用变量绑定。 拼装SQL的使用原则: 拼装SQL宜使用绑定变量。 拼装SQL语句的条件如果有外部输入源,应对输入条件进行字符检查,防止攻击。 在PL/pgSQL脚本中,单行代码的长度,不宜超过2499字符。 Trigger使用原则: Trigger可用于实现差量数据日志等与业务处理无关的可用性设计场景。 不应使用Trigger实现业务处理相关功能。
  • 总体开发原则 应完全按照设计文档进行开发。 程序模块应做到高内聚低耦合。 应有正确、全面的故障对策。 程序编写应做到结构合理,条理清晰。 程序名称命名应按照统一的命名规则进行命名。 应充分考虑程序的运行效率,包括程序的执行效率和数据库的查询、存储效率,在保证应用的同时应使用效率高的处理方法。 程序注释应详细、正确、规范。 除非应用特别需要控制COMMIT和ROLLBACK的提交时机,否则应在存储过程结束时执行显式的COMMIT或者ROLLBACK操作。 程序处理应支持7*24小时;对于程序中断,应用程序应提供安全、简单的断点再续处理。 应提供标准、简单的应用输出,为应用维护人员提供明确的进度显示、错误描述和运行结果;为业务人员提供明确、直观的报表、凭证输出。
  • 异常处理原则 任何在PL/pgSQL函数中发生的错误都会中止该函数的执行,实际上还会中止其周围的事务。可以使用带有EXCEPTION子句的BEGIN块捕获错误并且从中恢复。 在使用PL/pgSQL块中,如果使用了不能返回确定结果的SQL语句,应在EXCEPTION子句中对程序可能出现的异常进行处理,避免出现未处理的异常被传递到外层块,导致程序逻辑错误。 对于系统已经定义的异常,可以直接使用。DWS暂不支持自定义异常。 进入和退出一个包含EXCEPTION子句的块要比不包含EXCEPTION子句的块开销大的多。因此,非必要场景不使用EXCEPTION。
  • 书写规范 变量命名规则: 过程、函数的输入参数格式宜为:IN_参数名,参数名宜使用大写。 过程、函数的输出参数格式宜为:OUT_参数名,参数名宜使用大写。 过程、函数的输入输出参数格式宜为:IO_参数名,参数名宜使用大写。 过程、函数的程序中用到的变量宜由v_变量名组成,变量名宜使用小写。 将查询语句做成字符串拼接时,where语句的拼接变量名宜统一为v_where,select语句的拼接变量名宜为v_select。 记录(RECORD)的类型(TYPE)命名宜由T+变量名组成,名称宜使用大写。 游标命名宜由CUR+变量名组成,名称宜使用大写。 引用游标(REF CURSOR)的命名宜由REF+变量名组成,名称宜使用大写。 变量类型定义: 变量类型声明时,如果其含义和应用表某字段含义相同时,应使用%TYPE声明。 记录类型声明时,如果其含义和某应用表行数据相同时,应使用%ROWTYPE声明。 注释规范: 注释应该是有意义的,而不只是重述代码。 注释应简洁、易懂,以中文为主。为了表达准确,名词或操作上也可以使用英文。 应在每个存储过程、函数的开始加入注释,注释内容应包括:本程序的简要功能描述、编写者、编写日期、程序版本号信息和程序变更信息,同时各存储过程开头注释应保持统一格式。 应在输入输出参数的旁边添加注释,注明次变量的意义。 应在每个块或大分支的开始添加注释,描述块的简要功能,若使用算法,应添加注释简单描述算法的目的和结果。 变量声明格式: 每行应只包含一条语句,如同时需要赋初始值,应在同一行书写。 大小写规范: 除了变量名,应一律使用大写。 缩进规范: 创建存储过程语句中,同一层的CREATE、AS/IS、BEGIN、END这几个关键字应位于同一列,其他部分依次缩进。 语句详述: 变量定义语句。每行应只包含一条语句。 同一层的IF、ELSEIF、ELSE和END关键字应开始于同一列,执行语句缩进。 CASE和END关键字应位于同一列,WHEN和ELSE关键字应缩进。 同一层的LOOP和END LOOP关键字应位于同一列,层内语句或嵌套应依次缩进。