华为云用户手册

  • walwriter_sleep_threshold 参数说明:xlogflusher进入sleep之前空闲xlog刷新的次数,达到阈值会休眠。 参数类型:整型 参数单位:次 取值范围:1-50000 默认值:500(196核CPU/1536G内存,128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存,96核CPU/768G内存,80核CPU/640G内存,64核CPU/512G内存,60核CPU/480G内存);50(32核CPU/256G内存,16核CPU/128G内存,8核CPU/64G内存,4核CPU/32G内存,4核CPU/16G内存) 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:建议设置为默认值。
  • wal_sync_method 参数说明:设置向磁盘强制更新WAL数据的方法。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 如果将fsync关闭,这个参数的设置就没有意义,因为所有数据更新都不会强制写入磁盘。 取值范围:枚举类型 open_datasync表示用带O_DSYNC选项的open()打开“WAL”文件。 fdatasync表示每次提交的时候都调用fdatasync()(支持suse10和suse11)。 fsync_writethrough表示每次提交的时候调用fsync()强制把缓冲区任何数据写入磁盘。 由于历史原因,Windows平台支持将wal_sync_method设置为fsync_writethrough。在windows平台上fsync_writethrough和fsync等效。 fsync表示每次提交的时候调用fsync()(支持suse10和suse11)。 open_sync表示用带O_SYNC选项的open()写“WAL”文件(支持suse10和suse11)。 不是所有的平台都支持以上参数。 默认值:fdatasync
  • full_page_writes 参数说明:设置 GaussDB 服务器在检查点之后对页面的第一次修改时,是否将每个磁盘页面的全部内容写到WAL日志中。当enable_incremental_checkpoint和enable_double_write同时打开时,则不使用full_page_writes。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置这个参数是因为在操作系统崩溃过程中可能磁盘页面只写入了一部分内容,从而导致在同一个页面中包含新旧数据的混合。在崩溃后的恢复期间,由于在WAL日志中存储的行变化信息不够完整,因此无法完全恢复该页。把完整的页面影像保存下来就可以保证页面被正确还原,代价是增加了写入WAL日志的数据量。 关闭此参数,在系统崩溃的时候,可能无法恢复原来的数据。如果服务器硬件的特质(比如电池供电的磁盘控制器)可以减小部分页面的写入风险,或者文件系统特性支持(比如ReiserFS 4),并且清楚知道写入风险在一个可以接受的范畴,可以关闭这个参数。 取值范围:布尔型 on表示启用此特性。 off表示关闭此特性。 默认值:on
  • commit_delay 参数说明:表示一个已经提交的数据在WAL缓冲区中存放的时间。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置为非 0 值时事务执行commit后不会立即写入WAL中,而仍存放在WAL缓冲区中,等待WalWriter线程周期性写入磁盘。 如果系统负载很高,在延迟时间内,其他事务可能已经准备好提交。但如果没有事务准备提交,这个延迟就是在浪费时间。 取值范围:整型, 0~100000(微秒),其中0表示无延迟。 默认值:0
  • fsync 参数说明:设置GaussDB服务器是否使用fsync()系统函数(请参见wal_sync_method)确保数据的更新及时写入物理磁盘中。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 使用fsync()系统函数可以保证在操作系统或者硬件崩溃的情况下将数据恢复到一个已知的状态。 如果将此参数关闭,可能会在系统崩溃时无法恢复原来的数据,导致数据库不可用。 取值范围:布尔型 on表示使用fsync()系统函数。 off表示不使用fsync()系统函数。 默认值:on
  • wal_sender_bind_cpu_attr 参数说明:用于控制日志发送的绑核操作,仅sysadmin用户可以访问。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 'nobind':线程不做绑核。 'cpuorderbind: 8-12': 从8号核开始一个线程绑定一个CPU,区间内核不足就不参与绑定。建议区间大小设置为大于等于参数max_wal_senders。 取值范围:字符串,长度大于0,该参数不区分大小写。 默认值:'nobind'
  • 示例 --创建源表及触发表。 gaussdb=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); gaussdb=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); INSERT触发器的使用。 --创建insert触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE plpgsql; --创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --执行INSERT触发事件并检查触发结果。 gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) 匿名块和OR REPLACE语法创建触发器。 --使用匿名块语法创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --使用OR REPLACE语法创建INSERT触发器。 gaussdb=# CREATE OR REPLACE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --删除触发器。 gaussdb=# DROP TRIGGER insert_trigger_with_anonyblock ON test_trigger_src_tbl; -- 会将隐式创建的函数insert_trigger_with_anonyblock一起删除 UPDATE触发器的使用。 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 --创建UPDATE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS $$ DECLARE BEGIN UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建UPDATE触发器。 gaussdb=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --执行UPDATE触发事件并检查触发结果。 gaussdb=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) DELETE触发器的使用。 --创建DELETE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS $$ DECLARE BEGIN DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建DELETE触发器。 gaussdb=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行DELETE触发事件并检查触发结果。 gaussdb=# DELETE FROM test_trigger_src_tbl WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- (0 rows) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- (0 rows) 修改触发器名称。 1 2 --修改触发器的名称。 gaussdb=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --禁用insert_trigger触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //可以看到触发器没有生效。 id1 | id2 | id3 -----+-----+----- (0 rows) --禁用当前表上所有触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; 删除触发器。 1 2 3 4 5 gaussdb=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl; 删除函数。 1 2 3 4 5 gaussdb=# DROP FUNCTION tri_insert_func; gaussdb=# DROP FUNCTION tri_update_func; gaussdb=# DROP FUNCTION tri_delete_func; 1 2 3 --删除源表及触发表。 gaussdb=# DROP TABLE test_trigger_src_tbl; gaussdb=# DROP TABLE test_trigger_des_tbl;
  • 参数说明 OR REPLACE 可选项,指定此参数将在TRIGGER已存在的前提下修改已有的TRIGGER。 无法通过OR REPLACE语法创建或修改CONSTRAINT TRIGGER和INTERNAL TRIGGER。CONSTRAINT TRIGGER是指通过CREATE CONSTRAINT TRIGGER创建的TRIGGER,CONSTRAINT TRIGGER是指某些SQL语句隐式创建的TRIGGER(如给表加上外键约束会隐式创建4个TRIGGER,这4个TRIGGER即为INTERNAL TRIGGER)。 CONSTRAINT 可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。 name 触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 BEFORE 触发器函数是在触发事件发生前执行。 AFTER 触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。 INSTEAD OF 触发器函数直接替代触发事件。 event 启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。 对于UPDATE事件类型,可以使用下面语法指定列: UPDATE OF column_name1 [, column_name2 ... ] 表示当这些列作为UPDATE语句的目标列时,才会启动触发器,但是INSTEAD OF UPDATE类型不支持指定列信息。如果UPDATE OF指定的列包含生成列,当生成列依赖的列是UPDATE语句的目标列时,也会启动触发器。 table_name 需要创建触发器的表名称。 取值范围:数据库中已经存在的表名称。 referenced_table_name 约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。 取值范围:数据库中已经存在的表名称。 DEFERRABLE | NOT DEFERRABLE 约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。 详细介绍请参见CREATE TABLE。 INITIALLY IMMEDIATE | INITIALLY DEFERRED 如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。 详细介绍请参见CREATE TABLE。 FOR EACH ROW | FOR EACH STATEMENT 触发器的触发频率。 FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。 FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。 未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。 condition 决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。 在FOR EACH ROW触发器中,WHEN条件可以通过分别写入OLD.column_name或NEW.column_name来引用旧行或新行值的列。 INSERT触发器不能引用OLD,DELETE触发器不能引用NEW。 INSTEAD OF触发器不支持WHEN条件。 WHEN表达式不能包含子查询。 对于约束触发器,WHEN条件的评估不会延迟,而是在执行更新操作后立即发生。 如果条件返回值不为true,则触发器不会排队等待延迟执行。 ANONYBLOCK A数据库风格的匿名块,其中的语句在触发器触发时执行。使用匿名块语法创建trigger时会创建一个与trigger同名的函数,需要注意不能和现有函数名冲突。 function_name 用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。 arguments 执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。 关于触发器种类: INSTEAD OF的触发器必须标记为FOR EACH ROW,并且只能在视图上定义。 BEFORE和AFTER触发器作用在视图上时,只能标记为FOR EACH STATEMENT。 TRUNCATE类型触发器仅限FOR EACH STATEMENT。 表1 表和视图上支持的触发器种类: 触发时机 触发事件 行级 语句级 BEFORE INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 AFTER INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 INSTEAD OF INSERT/UPDATE/DELETE 视图 不支持 TRUNCATE 不支持 不支持 表2 plpgsql类型触发器函数特殊变量: 变量名 变量含义 NEW INSERT及UPDATE操作涉及tuple信息中的新值,对DELETE为空,并且对于statement级别的触发器此变量也为空。 OLD UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空,并且对于statement级别的触发器此变量也为空。 TG_NAME 触发器名称。 TG_WHEN 触发器触发时机(BEFORE/AFTER/INSTEAD OF)。 TG_LEVEL 触发频率(ROW/STATEMENT)。 TG_OP 触发操作(INSERT/UPDATE/DELETE/TRUNCATE),需为大写。 TG_RELID 触发器所在表OID。 TG_RELNAME 触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。 TG_TABLE_NAME 触发器所在表名。 TG_TABLE_SCHEMA 触发器所在表的SCHEMA信息。 TG_NARGS 触发器函数参数个数。 TG_ARGV[] 触发器函数参数列表。
  • 注意事项 须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的线程被终止。 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即DROP USER不支持跨数据库进行级联删除。 在删除用户时,需要先删除该用户拥有的所有对象并且收回该用户在其他对象上的权限,或者通过指定CASCADE级联删除该用户拥有的对象和被授予的权限。
  • 示例 --创建用户jim,登录密码为********。 gaussdb=# CREATE USER jim PASSWORD '********'; --创建用户kim,登录密码为********。 gaussdb=# CREATE USER kim IDENTIFIED BY '********'; --创建用户tom,登录密码为********。 gaussdb=# CREATE USER TOM PASSWORD '**********'; --创建用户TOM,登录密码为********。 gaussdb=# CREATE USER "TOM" PASSWORD '**********'; --如果需要创建具有“创建数据库”权限的用户,则需要加CREATEDB关键字。 gaussdb=# CREATE USER dim CREATEDB PASSWORD '********'; --查看用户dim的权限。 gaussdb=# \du dim List of roles Role name | Attributes | Member of -----------+------------+----------- dim | Create DB | {} (可以看到用户dim具有CREATEDB的权限) --修改用户jim的登录密码。 gaussdb=# ALTER USER jim IDENTIFIED BY '**********' REPLACE '********'; --为用户jim追加CREATEROLE权限。 gaussdb=# ALTER USER jim CREATEROLE; --查看用户jim追加的CREATEROLE权限。 gaussdb=# \du jim List of roles Role name | Attributes | Member of -----------+-------------+----------- jim | Create role | {} --将enable_seqscan的值设置为on, 设置成功后,在下一会话中生效。 gaussdb=# ALTER USER jim SET enable_seqscan TO on; --重置jim的enable_seqscan参数。 gaussdb=# ALTER USER jim RESET enable_seqscan; --锁定jim账户。 gaussdb=# ALTER USER jim ACCOUNT LOCK; --解锁jim账户。 gaussdb=# ALTER USER jim ACCOUNT UNLOCK; --修改用户密码。 gaussdb=# ALTER USER dim WITH PASSWORD '********'; --修改用户名。 gaussdb=# ALTER USER dim RENAME TO lisa; --删除用户。 gaussdb=# DROP USER kim CASCADE; gaussdb=# DROP USER jim CASCADE; gaussdb=# DROP USER lisa CASCADE; gaussdb=# DROP USER TOM CASCADE; gaussdb=# DROP USER "TOM" CASCADE;
  • 参数说明 IF EXISTS 使用该参数时,如果指定的用户不存在,发出一个notice而不是抛出一个错误,故使用该参数可以避免出现报错。 user_name 待删除的用户名。 取值范围:数据库中已存在的用户名。 CASCADE | RESTRICT CASCADE:级联删除依赖用户的对象,并收回授予该用户的权限。 RESTRICT:如果用户还有任何依赖的对象或被授予了其他对象的权限,则拒绝删除该用户(缺省行为)。 在GaussDB中,存在一个配置参数enable_kill_query,此参数在配置文件gaussdb.conf中。此参数影响级联删除用户对象的行为: 当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的线程,并删除用户。 当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的线程结束之后再删除用户。
  • audit_thread_num 参数说明:该参数表明用于审计的线程个数。 参数类型:整型 参数单位:个(表示线程数量) 取值范围:1~48 默认值:1 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:设置为默认值。 对性能的影响:线程数量设置越多,对系统性能的影响越大。 对资源占用的影响:线程数量设置越多,占用的系统CPU和I/O越多。 当audit_dml_state开关打开且在高性能场景下,建议增大此参数保证审计消息可以被及时处理和记录。
  • audit_rotation_interval 参数说明:指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,1~INT_MAX/60,单位为min。 默认值:1d 请不要随意调整此参数,否则可能会导致audit_resource_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit_resource_policy、audit_space_limit和audit_file_remain_time参数进行控制。
  • audit_file_remain_threshold 参数说明:审计目录下审计文件个数的最大值。 参数类型:整型 参数单位:个 取值范围:100 ~ 1048576 默认值: 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:建议设置为默认值。详情请参考以下须知。 1048576(196核CPU/1536G内存,128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存,96核CPU/768G内存,80核CPU/640G内存,64核CPU/512G内存,60核CPU/480G内存,32核CPU/256G内存,16核CPU/128G内存,8核CPU/64G内存,4核CPU/32G内存);1024(4核CPU/16G内存) 请尽量保证此参数为1048576,并不要随意调整此参数,否则可能会导致audit_resource_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit_resource_policy、audit_space_limit和audit_file_remain_time参数进行控制。 多审计线程场景下不建议调整此参数,请保证此参数不小于审计线程个数audit_thread_num,否则会导致审计功能无法正常使用与数据库异常。
  • audit_rotation_size 参数说明:指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,1024~1048576,单位为KB。 默认值:10MB 请不要随意调整此参数,否则可能会导致audit_resource_policy无法生效,如果需要控制审计日志的存储空间和时间,请使用audit_resource_policy、audit_space_limit和audit_file_remain_time参数进行控制。 审计日志文件中记录的单条日志占用空间大小超过此参数值时会被作为无效日志文件。
  • audit_space_limit 参数说明:审计文件占用的磁盘空间总量。 参数类型:整型 参数单位:KB 取值范围:1024KB~1024GB 默认值:1GB 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 多审计线程场景下,审计文件占用的磁盘空间最小值是audit_thread_num与audit_rotation_size的乘积,请保证audit_space_limit的值大于audit_thread_num与audit_rotation_size的乘积。
  • backtrace_min_messages 参数说明:控制当产生该设置参数级别相等或更高级别的信息时,会打印函数的堆栈信息到服务器日志文件中。 该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 该参数作为客户现场问题定位手段使用,且由于频繁的打印函数栈会对系统的开销及稳定性有一定的影响,因此如果需要进行问题定位时,建议避免将backtrace_min_messages的值设置为fatal及panic以外的级别。 取值范围:枚举类型 有效值有debug、debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见表1。 默认值:panic
  • log_min_duration_statement 参数说明:该参数用于控制记录每条完成语句的持续时间。当某条语句的持续时间大于或者等于特定的毫秒数时,这条语句将会被记录。 设置log_min_duration_statement可以很方便地跟踪需要优化的查询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花的时间将被独立记录。 参数类型:整型 参数单位:毫秒(ms) 当此选项与log_statement同时使用时,已经被log_statement记录的语句文本不会被重复记录。在没有使用syslog情况下,推荐使用log_line_prefix记录PID或会话ID,方便将当前语句消息连接到最后的持续时间消息。 取值范围:-1~2147483647 设置为250,所有运行时间不短于250ms的SQL语句都会被记录。 设置为0,输出所有语句的持续时间。 设置为-1,关闭此功能。 默认值:3s(即3000ms) 设置方式:该参数属于SUSET类型参数,请参见表1中对应设置方法进行设置。 设置建议:设置为默认值。
  • 注意事项 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 禁止其他用户在初始用户的表上创建包含用户自定义函数的表达式索引。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。 不支持XML类型数据作为普通索引、UNIQUE索引、GLOBAL索引、LOCAL索引、部分索引。 在线创建索引的类型只支持btree索引和ubtree索引。索引创建形式只支持非分区表普通索引及分区表GLOBAL索引、LOCAL索引,不支持PCR ubtree索引、二级分区与GSI。在线并行创建索引只支持Astore及Ustore的普通索引、GLOBAL索引、LOCAL索引。 CREATE INDEX创建索引可能会改变表的访问方式从而导致查询执行计划改变。
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。需要注意分区表上创建索引会根据如下规则进行判断:如果创建索引时申明了GLOBAL/LOCAL关键字,则创建对应类型的索引;否则如果创建索引指定分区名,则创建LOCAL索引;否则如果是unique索引,包含非分区键时创建GLOBAL索引,包含全部分区键则创建LOCAL索引;否则默认创建GLOBAL索引。
  • 语法格式 在表上创建索引。 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ IF NOT EXISTS ] [ [schema_name.] index_name ] ON table_name [ USING method ] ({ { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ INCLUDE ( column_name [, ...] ) ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ] [ WHERE predicate ]; 在分区表上创建索引。 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schema_name.] index_name ] ON table_name [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [ ( [SUBPARTITION index_subpartition_name] [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [, ...] ) ] [, ...] } ) ] | GLOBAL ] [ INCLUDE ( column_name [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ];
  • 示例 普通索引 --创建tbl_test1表。 gaussdb=# CREATE TABLE tbl_test1( id int, --用户id name varchar(50), --用户姓名 postcode char(6) --邮编 ); --创建表空间tbs_index1。 gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'test_tablespace/tbs_index1'; --为表tbl_test1创建索引idx_test1指定表空间。 gaussdb=# CREATE INDEX idx_test1 ON tbl_test1(name) TABLESPACE tbs_index1; --查询索引idx_test1信息。 gaussdb=# SELECT indexname,tablename,tablespace FROM pg_indexes WHERE indexname = 'idx_test1'; indexname | tablename | tablespace -----------+-----------+------------ idx_test1 | tbl_test1 | tbs_index1 (1 row) --删除索引。 gaussdb=# DROP INDEX idx_test1; --删除表空间。 gaussdb=# DROP TABLESPACE tbs_index1; 唯一索引 --为表tbl_test1创建唯一索引idx_test2。 gaussdb=# CREATE UNIQUE INDEX idx_test2 ON tbl_test1(id); --查询索引信息。 gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(6) | Indexes: "idx_test2" UNIQUE, btree (id) TABLESPACE pg_default --删除索引。 gaussdb=# DROP INDEX idx_test2; 表达式索引 --为表tbl_test1创建一个表达式索引。 gaussdb=# CREATE INDEX idx_test3 ON tbl_test1(substr(postcode,2)); --查询索引信息。 gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(7) | Indexes: "idx_test3" btree (substr(postcode::text, 2)) TABLESPACE pg_default --删除索引。 gaussdb=# DROP INDEX idx_test3; 部分索引 --为表tbl_test1中id不为为空的数据建立索引。 gaussdb=# CREATE INDEX idx_test4 ON tbl_test1(id) WHERE id IS NOT NULL; --删除索引。 gaussdb=# DROP INDEX idx_test4; --删除表。 gaussdb=# DROP TABLE tbl_test1; 分区索引 --建表。 gaussdb=# CREATE TABLE student(id int, name varchar(20)) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --创建LOCAL分区索引不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student1 ON student(id) LOCAL; --查看索引分区信息,发现LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student1'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区索引。 gaussdb=# DROP INDEX idx_student1; --创建GLOBAL索引。 gaussdb=# CREATE INDEX idx_student2 ON student(name) GLOBAL; --查看索引分区信息,发现GLOBAL索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student2'::regclass; relname --------- (0 rows) --删除GLOBAL分区索引。 gaussdb=# DROP INDEX idx_student2; --创建LOCAL表达式索引,不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student3 ON student(lower(name)) LOCAL; --查看索引分区信息,发现LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student3'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区表达式索引。 gaussdb=# DROP INDEX idx_student3; --创建GLOBAL表达式索引。 gaussdb=# CREATE INDEX idx_student4 ON student(lower(name)) GLOBAL; --查看索引分区信息,GLOBAL表达式索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student4'::regclass; relname --------- (0 rows) --删除GLOBAL分区表达式索引。 gaussdb=# DROP INDEX idx_student4; --删除表。 gaussdb=# DROP TABLE student;
  • 优化建议 create index 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 分区表创建GLOBAL索引时,存在以下约束条件: 不支持表达式索引、部分索引。 仅支持Btree索引。 在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存。 如果ALTER语句不带有UPDATE GLOBAL INDEX,那么原有的GLOBAL索引将失效,查询时将使用其他索引进行查询;如果ALTER语句带有UPDATE GLOBAL INDEX,原有的GLOBAL索引仍然有效,并且索引功能正确。
  • 参数说明 IF EXISTS IF EXISTS表示如果函数存在则执行删除操作,函数不存在也不会报错,只是发出一个notice。 function_name 要删除的函数名称。 取值范围:已存在的函数名。 argmode 函数参数的模式。 argname 函数参数的名称。 argtype 函数参数的类型 CASCADE | RESTRICT CASCADE:级联删除依赖于函数的对象 。 RESTRICT:如果有任何依赖对象存在,则拒绝删除该函数(缺省行为)。
  • 示例 删除函数可省略参数列表 --创建函数。 gaussdb=# CREATE FUNCTION func_test(varchar) RETURN VARCHAR AS BEGIN RETURN $1||_'test'; END; / --删除函数。 gaussdb=# DROP FUNCTION func_test; 删除存在同名的函数 如果存在同名函数,删除时需加上参数列表,否则报错。 --创建函数。 gaussdb=# CREATE FUNCTION func_add(int) RETURNS int AS $$ BEGIN RETURN $1+10; END; $$ LANGUAGE PLPGSQL; --重载函数func_add。 gaussdb=# CREATE FUNCTION func_add(int,int) RETURNS int AS $$ BEGIN RETURN $1+$2; END; $$ LANGUAGE PLPGSQL; --删除函数。 gaussdb=# DROP FUNCTION func_add(int); gaussdb=# DROP FUNCTION func_add(int,int);
  • job_queue_processes 参数说明:表示系统可以并发执行的job数目。该参数为postmaster级别,通过gs_guc设置,需要重启gaussdb才能生效。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:0~1000 功能: 当job_queue_processes设置为0值,表示不启用定时任务功能,任何job都不会被执行(因为开启定时任务的功能会对系统的性能有影响,有些局点可能不需要定时任务的功能,可以通过设置为0不启用定时任务功能)。 当job_queue_processes为大于0时,表示启用定时任务功能且系统能够并发处理的最大任务数。 启用定时任务功能后,job_scheduler线程会在定时时间间隔轮询pg_job系统表,系统设置定时任务检查周期默认为1s。 由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job_queue_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。 注:如果同一时间内并行的job数很多,过小的参数值会导致job等待。而过大的参数值则消耗更多的系统资源,建议设置此参数为100,用户可以根据系统资源情况合理调整。 默认值:10
  • enable_save_datachanged_timestamp 参数说明:确定是否收集insert/update/delete, exchange/truncate/drop partition操作对表数据改动的时间。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示允许收集相关操作对表数据改动的时间。 off表示禁止收集相关操作对表数据改动的时间。 默认值:on
  • track_procedure_sql 参数说明:该参数控制pg_stat_activity系统表中的query列是否同时打印该存储过程中正在执行的SQL语句。 参数类型:布尔型 参数单位:无 取值范围:on、off on表示调用存储过程时,pg_stat_activity的query列会同时打印存储过程正在执行的语句。 off表示调用存储过程时,pg_stat_activity的query列只打印存储过程调用语句。 默认值:on 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:无
  • track_activities 参数说明:控制收集每个会话中当前正在执行命令的统计数据。对于存储过程,打开该参数后,可以通过pg_stat_activity视图看到存储过程内正在执行的perform语句、调用存储过程语句、存储过程内的SQL语句、OPEN CURSOR语句。 该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示开启收集功能。 off表示关闭收集功能。 默认值:on 该参数设置为off影响存储引擎空间回收能力,会导致空间膨胀。
  • track_io_timing 参数说明:控制收集数据库I/O调用时序的统计数据。I/O时序统计数据可以在pg_stat_database中查询。 该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示开启收集功能,开启时,收集器会在重复地去查询当前时间的操作系统,这可能会引起某些平台的重大开销,故默认值设置为off。 off表示关闭收集功能。 默认值:off
共100000条