华为云用户手册

  • 创建列表(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) );
  • 分区策略选择 当表有以下特征时,可以考虑使用表分区策略: 数据具有明显区间性的字段。 分区表需要根据有明显区间性字段进行表分区。比如按照日期、区域、数值等字段进行分区,时间字段是最常见的分区字段。 业务查询有明显的区间范围特征。 查询数据可落到区间范围指定的分区内,这样才能通过分区剪枝,只扫描查询需要的分区,从而提升数据扫描效率,降低数据扫描的IO开销。 表数据量比较大。 小表扫描本身耗时不大,分区表的性能收益不明显,因此只建议对大表采取分区策略。列存储模式下因为每个列是单独的文件存储,且最小的存储单元CU可存储6w行数据,因此对于列存分区表,建议每个分区的数据不小于DN个数*6w。
  • Schema的权限控制 默认情况下,用户只能访问属于自己的Schema中的数据库对象。如需要访问其他Schema的对象,则需赋予对应Schema的usage权限。 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。 将myschema的usage权限赋给用户jack。 1 GRANT USAGE ON schema myschema TO jack; 将用户jack对于myschema的usage权限收回。 1 REVOKE USAGE ON schema myschema FROM jack;
  • 系统Schema 每个数据库都包含一个pg_catalog schema,它包含系统表和所有内置数据类型、函数、操作符。pg_catalog是搜索路径中的一部分,始终在临时表所属的模式后面,并在search_path中所有模式的前面,即具有第二搜索优先级。这样确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。 information_schema由一个包含数据库中对象信息的视图集合组成。 这些视图以一种标准化的方式从系统目录表中得到系统信息。
  • 使用Schema 在特定Schema下创建对象或者访问特定Schema下的对象,需要使用有Schema修饰的对象名。名称包含Schema名以及对象名,之间用“.”号分开。 在myschema下创建mytable表。以schema_name.table_name格式创建表。 1 CREATE TABLE myschema.mytable(id int, name varchar(20)); 查询myschema下mytable表的所有数据。 1 2 3 4 SELECT * FROM myschema.mytable; id | name ----+------ (0 rows)
  • 查看Schema 使用current_schema()函数查看当前Schema: 1 2 3 4 5 SELECT current_schema(); current_schema ---------------- myschema (1 row) 要查看Schema所有者,请对系统表PG_NAMESPACE和PG_USER执行如下关联查询。语句中的schema_name请替换为实际要查找的Schema名称。 1 SELECT s.nspname,u.usename AS nspowner FROM PG_NAMESPACE s, PG_USER u WHERE nspname='schema_name' AND s.nspowner = u.usesysid; 要查看所有Schema的列表,请查询PG_NAMESPACE系统表。 1 SELECT * FROM PG_NAMESPACE; 使用PGXC_TOTAL_SCHEMA_INFO视图查询整个集群的Schema空间使用情况。 1 SELECT * FROM PGXC_TOTAL_SCHEMA_INFO; 要查看属于某Schema下表的列表,请查询系统视图PG_TABLES。例如,以下查询会返回Schema PG_CATA LOG 中的表列表。 1 SELECT distinct(tablename),schemaname FROM PG_TABLES where schemaname = 'pg_catalog';
  • 创建Schema 使用CREATE SCHEMA命令来创建一个新的Schema。 1 CREATE SCHEMA myschema; 如果需要在模式中创建或者访问对象,其完整的对象名称由模式名称和具体的对象名称组成。中间由符号“.”隔开。例如:myschema.table。 用户可以创建一个由他人拥有的schema。例如,创建名为myschema的Schema,并指定Schema的所有者为用户jack。 1 CREATE SCHEMA myschema AUTHORIZATION jack; 若不指定authorization username,则其所有者为执行该命令的用户。
  • 设置Schema搜索路径 GUC参数search_path设置Schema的搜索顺序,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则该对象会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。 使用SHOW命令查看当前搜索路径。 1 2 3 4 5 SHOW SEARCH_PATH; search_path ---------------- "$user",public (1 row) search_path参数的默认值为:"$user",public。$user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。 使用SET命令修改当前会话的默认Schema。例如,将搜索路径设置为myschema、public,首先搜索myschema。 1 SET SEARCH_PATH TO myschema, public; 也可以使用ALTER ROLE命令为特定的角色(用户)设置search_path。例如: 1 ALTER ROLE jack SET search_path TO myschema, public;
  • 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 1 SET track_activities = on; 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: 1 SELECT datname, usename, state,pid FROM pg_stat_activity; 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则使用如下命令查看: 1 SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID结束会话。 1 SELECT PG_TERMINATE_BACKEND(139834759993104); 显示类似如下信息,表示结束会话成功。 1 2 3 4 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 1 2 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command gsql客户端使用PG_TERMINATE_BACKEND函数结束当前会话后台线程时,客户端不会退出而是自动重连。即还会返回“The connection to the server was lost. Attempting reset: Succeeded.” 1 2 3 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded.
  • 查看数据库中包含的表 例如,在PG_TABLES系统表中查看public schema中包含的所有表。 1 SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; 结果类似如下这样: 1 2 3 4 5 6 7 8 9 tablename ------------------- err_hr_staffs test err_hr_staffs_ft3 web_returns_p1 mig_seq_table films4 (6 rows)
  • 表分布的定义 GaussDB (DWS)支持的分布方式:复制表(Replication)、哈希表(Hash)和轮询表(Roundrobin)。 轮询表(Roundrobin)分布方式仅8.1.2及以上集群版支持。 策略 描述 适用场景 优势与劣势 复制表(Replication) 集群中每一个DN实例上都有一份全量表数据。 小表、维度表。 Replication优点是每个DN上都有此表的全量数据,在join操作中可以避免数据重分布操作,从而减小网络开销,同时减少了plan segment(每个plan segment都会起对应的线程) Replication缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表。 哈希表(Hash) 表数据通过hash方式散列到集群中的所有DN实例上。 数据量较大的事实表。 在读/写数据时可以利用各个节点的IO资源,大幅度提升表的读/写速度。 一般情况下大表(1000000条记录以上)定义为Hash表。 轮询表(Roundrobin) 表的每一行被轮番地发送给各个DN,数据会被均匀地分布在各个DN中。 数据量较大的事实表,且使用Hash分布时找不到合适的分布列。 Roundrobin优点是保证了数据不会发生倾斜,从而提高了集群的空间利用率。 Roundrobin缺点是无法像Hash表一样进行DN本地化优化,查询性能通常不如Hash表。 一般在大表无法找到合适的分布列时,定义为Roundrobin表,若大表能够找到合适的分布列,优先选择性能更好的Hash分布。
  • 查看表数据 使用系统表pg_tables查询数据库所有表的信息。 1 SELECT * FROM pg_tables; 使用gsql的\d+命令查询表的属性。 1 \d+ customer_t1; 执行如下命令查询表customer_t1的数据量。 1 SELECT count(*) FROM customer_t1; 执行如下命令查询表customer_t1的所有数据。 1 SELECT * FROM customer_t1; 执行如下命令只查询字段c_customer_sk的数据。 1 SELECT c_customer_sk FROM customer_t1; 执行如下命令过滤字段c_customer_sk的重复数据。 1 SELECT DISTINCT( c_customer_sk ) FROM customer_t1; 执行如下命令查询字段c_customer_sk为3869的所有数据。 1 SELECT * FROM customer_t1 WHERE c_customer_sk = 3869; 执行如下命令按照字段c_customer_sk进行排序。 1 SELECT * FROM customer_t1 ORDER BY c_customer_sk;
  • 创建表 CREATE TABLE命令创建一个表,创建表时可以定义以下内容: 表的列及数据类型。 表约束的定义,即任何用于限制列或者表中数据的表约束或者列约束。参见表约束的定义。 表分布的定义,即表的分布策略,它决定GaussDB(DWS)数据库如何在片(Segment)之间划分数据。 参见表分布的定义。 表存储格式。参见选择GaussDB(DWS)表存储模型。 分区表定义。参见创建和管理GaussDB(DWS)分区表。
  • 删除表数据 请谨慎执行DROP TABLE和TRUNCATE TABLE命令,删除表后,数据将无法恢复。 从数据库中删除表customer_t1。 1 DROP TABLE customer_t1; 清空一个表的行但不移除该表的定义,可使用DELETE或者TRUNCATE。 删除表customer_t1中所有的行。 1 TRUNCATE TABLE customer_t1; 删除表customer_t1中所有的行。 1 DELETE FROM customer_t1; 删除表customer_t1中所有c_customer_sk为3869的记录: 1 DELETE FROM customer_t1 WHERE c_customer_sk = 3869;
  • 使用压缩 表压缩可以在创建表时开启,压缩表能够使表中的数据以压缩格式存储,意味着占用相对少的内存。 对于I/O读写量大,CPU富足(计算相对小)的场景,选择高压缩比;反之选择低压缩比。建议依据此原则进行不同压缩下的测试和对比,以选择符合自身业务情况的最优压缩比。压缩比通过COMPRESSION参数指定,其支持的取值如下: 列存表为:YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 行存表为:YES/NO,默认值为NO。(行存表压缩功能暂未商用,如需使用请联系技术支持工程师) 各压缩级别所适用的业务场景说明如下: 压缩级别 所适用的业务场景 低级别压缩 系统CPU使用率高,存储磁盘空间充足。 中度压缩 系统CPU使用率适中,但存储磁盘空间不是特别充足。 高级别压缩 系统CPU使用率低,磁盘空间不充裕。 例如,创建一个名为customer_t3的列存压缩表: 1 2 3 4 5 6 7 CREATE TABLE customer_t3 ( state_ID CHAR(2), state_NAME VARCHAR2(40), area_ID NUMBER ) WITH (ORIENTATION = COLUMN,COMPRESSION=middle);
  • 模板和默认数据 GaussDB(DWS)提供了两个模板数据库template0、template1,以及一个默认的数据库gaussdb。 默认情况下,每个新创建的数据库都是基于一个模板数据库。GaussDB(DWS)数据库默认使用template1作为模板,编码格式为SQL_ASCII,且不允许自定义字符编码。若创建数据库时需指定字符编码,请使用template0创建数据库。 请避免使用客户端或其他手段连接及操作两个模板数据库。 通过“show server_encoding”命令可以查看当前数据库存储编码。
  • 创建数据库 使用CREATE DATABASE语句创建一个新的数据库。 1 CREATE DATABASE mydatabase; 创建数据库时,若数据库名称长度超过63字节,server端会对数据库名称进行截断,保留前63个字节,因此建议数据库名称长度不要超过63个字节,不要使用多字节字符作为对象名。(如果出现因为误操作导致在多字节字符的中间截断进而无法删除数据库对象的现象,请使用截断前的数据库对象名进行删除操作,或将该对象从各个数据库节点的相应系统表中依次删掉。) 数据库名称遵循SQL标识符的一般规则。当前用户自动成为此新数据库的所有者。 如果一个数据库系统用于承载相互独立的用户和项目,建议把它们放在不同的数据库里。 如果项目或者用户是相互关联的,并且可以相互使用对方的资源,则应该把它们放在同一个数据库里,但可以规划在不同的Schema中。 GaussDB(DWS)允许创建的数据库总数目上限为128个。 用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库。
  • GaussDB(DWS)数据库对象命名规则 数据库对象命名需要满足约束:长度不超过63个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$。 【建议】避免使用保留或者非保留关键字命名数据库对象。 可以使用SELECT * FROM pg_get_keywords()查询GaussDB(DWS)的关键字,或者在《SQL语法参考》中“关键字”章节中查看。 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,GaussDB(DWS)中使用双引号将数据库对象名称括起来时表示对大小写敏感。数据库对象名称大小写敏感会使定位问题难度增加。 【建议】数据库对象命名风格务必保持统一。 增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。 数据库对象名称由字母、数字和下划线组成,并且不能由数字开头。建议使用多个单词组成,以下划线分割。 数据库对象名称最好能够望文知意,尽量避免使用自定义缩写(可以使用通用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英文词汇或汉语拼音,但规则应该在集群范围内保持一致。 变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前缀标明该变量的类型。 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区分该表是普通表、临时表还是非日志表: 普通表名按照数据集的业务含义命名。 临时表以“tmp_+后缀”命名。 非日志表以“ul_+后缀”命名。 外表以“f_+后缀”命名。 父主题: GaussDB(DWS)开发设计建议
  • DDL 【建议】在GaussDB(DWS)中,建议DDL(建表、comments等)操作统一执行,在批处理作业中尽量避免DDL操作。避免大量并发事务对性能的影响。 【建议】在非日志表(unlogged table)使用完后,立即执行数据清理(truncate)操作。因为在异常场景下,GaussDB(DWS)不保证非日志表(unlogged table)数据的安全性。 【建议】临时表和非日志表的存储方式建议和基表相同。当基表为行存(列存)表时,临时表和非日志表也推荐创建为行存(列存)表,可以避免行列混合关联带来的高计算代价。 【建议】索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 【建议】不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • 数据加载和卸载 【建议】在insert语句中显式给出插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 【建议】在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行analyze操作,防止统计信息不准确而导致的执行计划劣化。 【建议】如果要清理表中的所有数据,建议使用truncate table方式,不要使用delete table方式。delete table方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • 阅读指引 对于首次接触 GaussDB(DWS)的用户,建议先阅读以下部分: 介绍GaussDB(DWS)服务的特点、功能和适用场景。 GaussDB(DWS)入门包含一个示例,引导您完成创建 数据仓库 集群、创建数据库表、上传数据和测试查询这一过程。 如果打算或正在将应用程序从其他数据仓库向GaussDB(DWS)迁移,您可能想知道GaussDB(DWS)在实施方式上有什么区别。 GaussDB(DWS)进行数据库应用程序开发过程中,下表将帮您找到对应的信息。 如果要.. 查阅建议 快速开始使用GaussDB(DWS)。 首先,按照《数据仓库服务快速入门》中的步骤快速部署集群、连接到数据库并尝试进行一些查询。 准备好构建数据库后,将数据加载到表中并编写查询内容以操作数据仓库中的数据后,可以回到《数据仓库服务数据库开发指南》。 了解GaussDB(DWS)数据仓库的内部架构。 如果您想要更全面地了解GaussDB(DWS)服务,请转到GaussDB(DWS)产品首页。 了解如何设计表以实现良好性能。 GaussDB(DWS)开发设计建议介绍数据库应用程序开发过程中,应当遵守的设计规范。依据这些规范进行建模,能够更好的契合GaussDB(DWS)的分布式处理架构,输出更高效的业务SQL代码。 对业务的执行效率不满意,期望通过调优加快业务执行的情况下,可以参考GaussDB(DWS)性能调优进行调优。性能调优是一项复杂的工程,有些时候无法系统性地说明和解释,而是依赖于DBA的经验判断。尽管如此,GaussDB(DWS)性能调优一节还是期望能尽量系统性的对性能调优方法加以说明,方便应用开发人员和刚接触GaussDB(DWS)的DBA参考。 加载数据。 导入数据介绍数据入库GaussDB(DWS)的方法和途径。 导入最佳实践提供有关快速高效数据导入的经验提示。 管理用户、组和数据库安全。 GaussDB(DWS)数据库安全管理涵盖数据库安全主题。 监控和优化系统性能。 GaussDB(DWS)系统表和系统视图详细介绍您可以从中查询数据库状态并监控查询内容与流程的系统表和视图。 您还应该查阅管理指南了解如何使用GaussDB(DWS)管理控制台检查系统运行状况、监控指标。
  • SQL语法文本格式约定 为了方便对语法使用的理解,在文档中对SQL语法文本按如下格式进行表述。 格式 意义 大写 语法关键字(语句中保持不变、必须照输的部分)采用大写表示。 小写 参数(语句中必须由实际值进行替代的部分)采用小写表示。 [ ] 表示用“[ ]”括起来的部分是可选的。 ... 表示前面的元素可重复出现。 [ x | y | ... ] 表示从两个或多个选项中选取一个或者不选。 { x | y | ... } 表示从两个或多个选项中选取一个。 [x | y | ... ] [ ... ] 表示可选多个参数或者不选,如果选择多个参数,则参数之间用空格分隔。 [ x | y | ... ] [ ,... ] 表示可选多个参数或者不选,如果选择多个参数,则参数之间用逗号分隔。 { x | y | ... } [ ... ] 表示可选多个参数,至少选一个,如果选择多个参数,则参数之间以空格分隔。 { x | y | ... } [ ,... ] 表示可选多个参数,至少选一个,如果选择多个参数,则参数之间用逗号分隔。
  • 声明 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.
  • 释放连接 【建议】推荐使用连接池限制应用程序的连接数。每执行一条SQL就连接一次数据库,是一种不好SQL的编写习惯。 【建议】在应用程序完成作业任务之后,应当及时断开和GaussDB(DWS)的连接,释放资源。建议在任务中设置session超时时间参数。 【建议】使用JDBC连接池,在将连接释放给连接池前,需要执行以下操作重置会话环境。否则,可能会因为历史会话信息导致的对象冲突。 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须执行“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。
  • 连接参数 【关注】第三方工具通过JDBC连接GaussDB(DWS)时,JDBC向GaussDB(DWS)发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。 params = { { "user", user }, { "database", database }, { "client_encoding", "UTF8" }, { "DateStyle", "ISO" }, { "extra_float_digits", "2" }, { "TimeZone", createPostgresTimeZone() }, }; 这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。 如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。 【建议】通过JDBC连接数据库时,应该保证下面两个时区设置一致: JDBC客户端所在主机的时区。 GaussDB(DWS)集群所在主机的时区。
  • GaussDB(DWS)总体开发设计规范 为有效提升数据开发效率、降低资源消耗、减少业务阻塞,在使用GaussDB(DWS)进行数据开发之前,开发设计应遵循表1列举的开发设计规范。 本设计规范分为注意、警告、危险3个等级,各等级含义如下: 注意:建议用户遵守的设计规范。如果不遵守,可能会影响业务性能、增加运维难度。 警告:遵守这些规则,能够保证业务的高效运行;违反这些规则,可能导致业务阻塞、业务报错。 危险:违反这些规则,可能会造成数据误删、或导致系统重大变更甚至故障。 表1 总体开发设计规范 场景 序号 规范 等级 不遵守规范带来的影响 用户和连接管理 1 尽量避免所有业务使用同一个数据库用户运行,按业务模块规划不同数据库用户。 注意 异常业务或用户操作导致整体集群问题时,无法快速隔离和管控。 2 不建议使用系统管理员用户跑业务,不同模块业务请通过多用户和权限进行访问控制。 注意 管理员用户权限过高,难以管控。 3 不建议业务直连单CN,需配置负载均衡保证各CN连接均衡。 警告 CN上连接不均、负载倾斜拖慢整体性能、CN故障时业务无法自恢复。 4 连接数据库完成所需操作后,要及时关闭数据库连接,避免空闲连接持续占位,消耗连接和公共资源。 警告 空闲连接过多,消耗大量公共资源,正常业务无法建立连接和运行。 5 使用数据库连接池的场景,在业务中通过SET语句进行数据库GUC参数设置后,归还连接池前必须通过RESET还原参数设置。 警告 使用连接池的作业之间互相干扰。 对象设计 6 不建议创建普通表时指定自定义TABLESPACE。 警告 自定义表空间所占存储空间不受管控,会导致空间和性能类问题。 7 创建行存表时应避免指定COMPRESS压缩属性。 警告 行存压缩功能不稳定,后续已废弃。 8 针对普通列存表不建议频繁进行小批量实时入库。 警告 列存实时入库导致小CU膨胀严重,触发持续的空间、资源、性能类问题。 9 创建HASH分布的表对象时,要确保数据分布均匀(10G以上数据量的表,倾斜率控制在10%以内)。 警告 数据分布倾斜,进而导致计算倾斜,导致空间和性能类问题。 10 创建REPLICATION分布的表对象,要确保表数据量控制在100万行以内。 注意 复制表数据量过大会导致存储空间增长风险。 11 创建HSTORE表时,必须确保数据库GUC参数设置满足以下条件: autovacuum设置为on。 autovacuum_max_workers_hstore取值大于0。 autovacuum_max_workers取值大于autovacuum_max_workers_hstore的取值。 警告 HSTORE的delta表急剧膨胀,性能持续下降。 12 针对存在时间字段的大表(数据量5000万行以上),必须设计成分区表,根据查询特征合理设计分区间隔。 警告 针对分区表进行特定时间段的查询、清理效率远高于非分区表。 13 针对有大批量数据增删改的表,索引个数建议控制在3个以内,最多不超过5个。 建议 索引过多影响增删改效率,严重时还会导致xlog堆积和集群故障。 操作规范 14 客户端显式开启事务或手动关闭Autocommit场景,业务最后必须手动执行Commit提交事务。 警告 事务不提交导致长事务,阻塞其他持锁业务和回收操作。 15 针对执行时长超过30分钟的语句,建议优化。 注意 业务效率及性能问题。 16 尽量避免出现执行时长超过2小时的业务,避免长事务、长持锁等影响。 警告 业务性能,长事务阻塞其他持锁业务和回收操作。 17 DROP对象操作(如DATABASE、USER/ROLE、SCHEMA、TABLE、VIEW等对象)存在数据丢失风险,尤其含带CASCADE级联删除场景,会将关联的对象一并删除,操作需谨慎,操作前需考虑数据备份。 危险 数据被异常删除,无法快速恢复。 18 避免在业务高峰期执行ALTER(增删改列、DROP PARTITION等)、TRUNCATE操作,避免有长SQL阻塞ALTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。 警告 ALTER、TRUNCATE持锁级别高,会阻塞其他也并发业务,也会被其他业务阻塞,造成业务卡问题。 19 避免在业务高峰期执行对大表执行CREATE INDEX和REINDEX操作。 警告 CREATE INDEX、REINDEX操作会阻塞数据入库,大表上执行耗时较长会长时间阻塞数据入库。 20 尽量避免出现计划不下推的SQL写法(EXPLAIN输出的执行计划中出现"_REMOTE_XXX_QUERY_")。 注意 业务性能问题、CN瓶颈。 21 尽量避免行存大表(数据量1000万行以上)的频繁COUNT查询。 注意 业务性能问题、高IO资源消耗。 22 单SQL的UNION/UNION All分支不能超过50,多表关联不能超过25张非复制表。 注意 业务性能问题、高资源消耗。 23 尽量避免大表关联时缺少关联条件而求笛卡尔积。 注意 业务性能问题、高资源消耗。 24 多表关联查询时,单个语句Stream建议控制在100以内。 注意 业务性能问题、高CPU消耗。 25 谨慎使用递归语句(WITH RECURSIVE),需明确数据重复度和终止条件,确保递归可按预期结束。 注意 业务性能问题、死循环。 26 避免使用UPDATE/DELETE大批量刷新和删除数据,考虑使用TRUNCATE PARTITION/DROP PARTITION代替。 注意 业务性能、脏页问题。 27 避免UPDATE/UPSERT并发更新同一张列存表。 注意 业务性能、锁问题。 28 尽量避免使用存储过程,尤其不要开发结构复杂、嵌套多层的存储过程。 注意 维护效率低、问题定位成本高。 运维管理 29 集群级的数据库参数调整为变更操作,建议联系华为方进行变更风险评估 危险 集群级参数调整可能对客户业务造成影响,需做好评估。 30 单次新增、修改量占表总量10%以上场景,需在业务中增加显式ANALYZE操作。 警告 业务性能稳定性问题。 31 定期对脏页率、小CU占比超过25%的表执行VACUUM FULL,普通表需在低峰期执行,系统表需离线执行。 警告 对象膨胀、业务性能问题。 32 数据库重要程度以上告警,需及时处理并消除告警。 警告 集群长期稳定性。 33 业务批量上线、上量前需在测试集群进行相当规模测试验证,并知会技术支持人员进行业务保障。 注意 业务上线评估、保障。 父主题: GaussDB(DWS)开发设计建议
  • GaussDB(DWS)数据库对象命名规则 数据库对象命名需要满足约束:长度不超过63个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$。 【建议】避免使用保留或者非保留关键字命名数据库对象。 可以使用SELECT * FROM pg_get_keywords()查询GaussDB(DWS)的关键字,或者在《SQL语法参考》中“关键字”章节中查看。 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,GaussDB(DWS)中使用双引号将数据库对象名称括起来时表示对大小写敏感。数据库对象名称大小写敏感会使定位问题难度增加。 【建议】数据库对象命名风格务必保持统一。 增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。 数据库对象名称由字母、数字和下划线组成,并且不能由数字开头。建议使用多个单词组成,以下划线分割。 数据库对象名称最好能够望文知意,尽量避免使用自定义缩写(可以使用通用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英文词汇或汉语拼音,但规则应该在集群范围内保持一致。 变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前缀标明该变量的类型。 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区分该表是普通表、临时表还是非日志表: 普通表名按照数据集的业务含义命名。 临时表以“tmp_+后缀”命名。 非日志表以“ul_+后缀”命名。 外表以“f_+后缀”命名。 父主题: GaussDB(DWS)开发设计规范
  • DDL 【建议】在GaussDB(DWS)中,建议DDL(建表、comments等)操作统一执行,在批处理作业中尽量避免DDL操作。避免大量并发事务对性能的影响。 【建议】在非日志表(unlogged table)使用完后,立即执行数据清理(TRUNCATE)操作。因为在异常场景下,GaussDB(DWS)不保证非日志表(unlogged table)数据的安全性。 【建议】临时表和非日志表的存储方式建议和基表相同。当基表为行存(列存)表时,临时表和非日志表也推荐创建为行存(列存)表,可以避免行列混合关联带来的高计算代价。 【建议】索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 【建议】除非已经明确对象间的依赖关系,否则不要使用DROP…CASCADE方式删除对象,以免误删。
  • 数据加载和卸载 【建议】在INSERT语句中显式给出插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 【建议】在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行ANALYZE操作,防止统计信息不准确而导致的执行计划劣化。 【建议】如果要清理表中的所有数据,建议使用truncate table方式,不要使用delete table方式。delete table方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • 自定义GaussDB(DWS)外部函数(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)开发设计规范
共100000条