• [分享交流] 物联网技术未来发展趋势如何?
    物联网技术未来发展趋势如何?
  • [技术干货] 【技术干货】 大数据干货合集(2025年11月)
    导出数据cid:link_6计划诊断cid:link_7共享自定义数据源cid:link_0IAM用户导出按钮权限配置cid:link_8新增目录cid:link_1数据开发设置cid:link_9sql_dialect插件实现SQL自由兼容cid:link_2不可定义IMMUTABLE的几种情况cid:link_10下推属性cid:link_3入参含NULL处理cid:link_4如何写出性能最优的函数cid:link_11函数内设置GUC变量优化cid:link_12函数变更cid:link_13查询过滤器cid:link_5权限问题https://bbs.huaweicloud.com/forum/thread-0293199787641436055-1-1.html
  • [技术干货] 权限问题
    对于普通用户来讲是没有创建查询过滤规则权限的,需要管理员或者管理员将权限赋给某一普通用户才可以。建议创建查询过滤规则时尽量缩小适用范围,避免误过滤,或者范围过大导致性能劣化。对于查询过滤规则的备份或者恢复的权限与操作元数据的权限一致,需要管理员或者管理员讲权限赋值给某一普通用户才可以,用户可以通过gs_dump导出查询过滤规则定义。如果想查看或者导入查询过滤规则的定义,可以通过pg_get_blockruledef进行查询。所有的查询过滤规则元数据全部保存在pg_blocklists系统表中,可以通过查看系统表浏览所有的查询过滤规则。查询语句包含了tt关键字,并且扫描的分区个数超过了2,此时执行语句被过滤拦截。需要注意的是,扫描分区的个数并不总是准确的,仅能识别静态的分区剪枝个数,执行过程中的动态剪枝并不能被识别。使用关键词过滤时可以先使用正则匹配符~*进行测试,正则匹配是忽略大小写的。另外,由于查询过滤器的规则直接作用在用户block_user上,因此在删除用户block_user时,会提示有依赖项,此时可以通过在语句最后加上cascade进行删除,此时作用在此用户上的查询过滤规则也会被一同删除。需要注意的是,过滤规则命中的依据是,with_parameter命中任意一项,且其他字段的特征也符合即会判定为符合查询过滤规则。
  • [技术干货] 查询过滤器
    在业务开发过程中,要想禁止对2张以上的表进行关联查询,此时可以使用DDL语句创建过滤规则:table_num指的是一个语句中出现的表的个数,此时所有查询语句不能包含有两张表以上的查询。整体逻辑就非常清楚了。用户可以提前识别烂SQL的特征,然后抽象出来,用DDL语句创建规则,后续会对查询的语句进行过滤,被规则筛选出来的便是烂SQL,执行前会报错,反之则可以正常执行。之前的查询过滤器的功能依然存在,可以保证与异常规则的联动,新版本的增强更注重规则的灵活性和功能的丰富性。查询过滤规则,可以通过DDL进行新增、删除或者修改,其语法如下:block_name: 过滤规则的名称user_name: 规则应用的对象用户host: 是规则应用的客户端IPFOR: 语句类型,支持对UPDATE/SELECT/INSERT/DELETE/MEGE INTO五种类型语句进行限制FILTER BY: 过滤方法,包含两种形式SQL: 根据关键词对语句进行正则匹配,例如表名,其长度不能超过1024,建议尽量精简TEMPLATE:sql_hash:归一化的哈希值(md5),一般不会重复,相较unique_sql_id更推荐使用。unique_sql_id:归一化的64位哈希值,重复概率较sql_hash大一些。with_parameter: 查询过滤规则选项参数,可以附加多个条件,满足其一便会匹配过滤。application_name: 客户端名称query_band: 负载标识table_num: 包含的基表个数partition_num: 扫描分区的数量estimate_row: 基表输出行数resource_pool: 切换的目标资源池,仅适用于9.1.0.200及以上max_active_num: 可并发执行的语句个数,仅适用于9.1.0.200及以上is_warning: 改变拦截行为为告警,而非默认的报错,仅适用于9.1.0.200及以上其中,user_name和FILTER BY是必选项,其他可以通过业务实际需要进行配置。
  • [技术干货] 函数变更
    函数参数个数和类型,一旦定义,不允许变更。防止用户业务报错。函数行为也禁止前后不兼容的变更,如果必须要变,需要在内核加GUC参数进行控制。这样也造成了与内核的依赖。将新函数放入dialects目录对应的方言文件中,同时还要在升级脚本中再进行处理。通过独立C函数(少量使用内核基础函数),都可以放入插件。在插件中现有或新增的cpp中编写函数。查询过滤器在9.1.0.100之前就具备提供查询过滤功能的能力,但仅支持自动隔离反复查询被终止的查询,防止烂SQL再次执行。老版本主要面向异常熔断机制和紧急拦截场景,前者可以与异常规则联动,自动将触发异常规则的语句添加到黑名单中,后者是需要手动找到core或者引发hang的语句进行屏蔽。9.1.0.100及9.1.0.200版本对查询过滤器做了功能的改进,可以通过多维度进行烂SQL识别,功能更丰富,配置更灵活。
  • [技术干货] 函数内设置GUC变量优化
    尽量避免在函数内部设置环境变量,SET会多CN执行,造成不必要的通信开销。VOLATILE属性的SQL语言函数会频繁访问GTM,性能差,且给GTM造成比较大的压力。因此,LANGUAGE为SQL的函数,尽量不要定义为VOLATILE。函数参数的类型和返回值类型,要严格注意。避免类型转换导致的core或结果集错误。一些常见错误:应该返回timestamptz,而返回了text。结果看似一样,实际无法使用。应该返回timestamptz,而返回了timestamp,丢失了时区,未注意到。不兼容类型的强制转换,导致C函数调用core。调用内存C函数时,需要传入timestamptz类型,却给了timestamp类型,导致时区转换错误。能自动隐式类型转换的类型,尽量只写一个函数。例如:text和timestamp都可以向timestamptz自动转换,不必每个类型都实现一个相似函数。尽量使用pg原生函数定义新函数。因为兼容性函数可能因为各种兼容性导致后期修改,从而级联导致新函数结果集不稳定。
  • [技术干货] 如何写出性能最优的函数
    类似C++中的inline能力,如果是简短的计算或转换函数,正确的书写为满足inline特征的函数,则优化器可将函数调用优化成表达式执行,明显提升执行性能。可被优化器自动优化为 ```$1 + $2``` 的表达式。下面执行计划输出的Output已不再是函数调用,而是优化为(a+b)表达式。inline函数要求:函数类型,LANGUAGE必须是SQL类型。函数易变性,不能是VOLATILE,且易变性不高于函数体内的语句。例如:函数体内调用的函数其易变性为STABLE,则该函数只能是STABLE,不能是IMMUTABLE。从高到底按照IMMUTABLE STABLE VOLATILE排序。函数strict属性,必须与函数体内包含的函数strict一致。函数体,函数中必须为简单的单条select语句,不含group by等复杂逻辑。函数返回值,函数内语句返回类型必须与该函数返回类型一致,且不能是set和record等复杂类型。入参含NULL优化入参含NULL返回值也肯定为NULL的函数,要显示定义STRICT属性。这样当入参含NULL时,可以减少函数体的调用执行。函数类型选择从性能方面考虑,尽量按照SQL函数>C函数>plpgsql函数顺序选择函数类型。SQL函数简单计算优先使用SQL类型,尽量满足inline特征。C函数非单条语句的函数建议定义为C函数申请的内存要用完及放保护模式必须显示定义为DENCED模式入参和返回值类型严格注意,避免类型不一致或强制转换导致core或结果集问题。
  • [技术干货] 入参含NULL处理
    CALLED ON NULL INPUT(默认):表明该函数的某些参数是NULL的时候可以按照正常的方式调用该函数,函数开发者需自己做判空处理。RETURNS NULL ON NULL INPUT或STRICT:如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。RETURNS NULL ON NULL INPUT和STRICT的功能相同。入参含NULL返回值也为NULL的,尽量显示定义STRICT。保护模式声明用户定义的C函数是否在保护模式下执行。FENCED模式(默认):则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。NOT FENCED模式:函数的执行在CN或者DN进程中进行;如何选择:正在开发或者调试的Function使用FENCED模式。开发测试完成,使用NOT FENCED模式执行,减少fork进程以及通信的开销。复杂的操作系统操作,例:打开文件,信号处理,线程处理等操作,使用FENCED模式。否则可能影响GaussDB(DWS)数据库的执行。C函数必须是FENCED模式。
  • [技术干货] 下推属性
    SHIPPABLE:表示该函数可以下推到DN上执行。NOT SHIPPABLE(默认):表示该函数不可以下推到DN上执行。注意:对于IMMUTABLE函数,不管SHIPPABLE如何设置,函数始终可以下推到DN上执行。对于STABLE/VOLATILE函数,当且仅当函数属性是SHIPPABLE的时候,函数才可以下推到DN执行。定义SHIPPABLE属性时需特别慎重,SHIPPABLE意味着整个函数会下推到DN上执行,如果设置不当,会导致结果错误等严重问题。与定义IMMUTABLE属性一样,SHIPPABLE属性的定义也有诸多约束,简单来说就是函数体内不能有不可下推的因素,函数下推到单DN执行后,函数内部的计算逻辑仅依赖当前DN的数据集合。举例如下:如果函数内部引用了表,并且表为HASH分布,那么该函数通常不能定义为SHIPPABLE。函数内部有不可下推的因素,函数,语法等,那么该函数不能定义为SHIPPABLE,可参考语句下推调优。函数内部的计算过程可能需要跨DN数据,这种情况该函数通常不能定义为SHIPPABLE,例如一些聚合运算等。
  • [技术干货] 不可定义IMMUTABLE的几种情况
    函数中引用了表,视图等对象,因为当表的数据发生变化的时候,函数的返回值可能发生变化。函数中引用了STABLE/VOALATILE类型的函数,那么该函数不能定义为IMMUTABLE。函数中有不下推的因素,因为IMMUTABLE意味着要下推到DN执行,与函数体内部的不下推因素相互冲突。典型场景例如,包含不下推的函数、语法等。函数中含有聚合运算,但聚合运算的运算需要生成STREAM计划才能完成计算的(部分结果在DN计算,部分结果在CN计算,例如listagg函数等)。为了防止错误定义IMMUTABLE可能导致严重问题,数据库内部可以通过设置behavior\_compat\_options=‘check\_function\_conflicts’来开启对函数定义冲突的检查,目前可以识别出上述1和2场景。 
  • [技术干货] sql_dialect插件实现SQL自由兼容
    sql_dialect插件是DWS用于支持各种SQL方言的插件包。优先级:方言插件中函数优先级高于数据库内核中的函数,便于解决与内核的冲突。绑定方言:每一个数据库可以独立绑定方言插件,与CREATE DATABASE时选择的DBCOMPATIBILITY没有关联关系,但建议保持一致。修改方言:方言插件一旦绑定,不支持修改,除非先卸载插件再重新绑定。插件基础能力:支持简单SQL实现的函数,支持plpgsql实现的函数,支持C实现的函数,支持独立的升降级,与内核升降级无关,可以通过管控面平台,快速发布升级。VOLATILE(默认): 表示函数返回值在一次表扫描内随时可以改变,例如:random, currval, timeofday等。这也导致这些函数不会被做任何优化。STABLE: 表示对相同函数入参,在同一次表扫描里,该函数的返回值不会变,但是在同一会话的不同SQL多次调用时可能会变化。IMMUTABLE: 表示该函数在相同入参时总是返回同样的结果。也就是说该函数不会通过查询数据库,GUC参数,随机数,当前时间等可能不确定性的因素来生成函数返回值。如果入参是常量,这类函数可以直接被优化器替换为函数值,减少函数调用。注意:IMMUTABLE函数会被自动下推到DN执行,如果用户错误定义了函数的IMMUTABLE属性,那么可能会导致结果集错误。因此,用户在指定函数的属性为IMMUTABLE的时候,要特别慎重。 
  • [技术干货] 数据开发设置
    数据开发设置针对当前用户配置,可以配置OBS桶名称、地址等信息,以及数据库,模式权限过滤等开关,用户根据个人使用习惯去配置不同的操作项。编辑器:主要是对编辑器主题部分编写SQL的基础设置,比如默认选择自动联想,可补全一些关键字;选择字段提示,在写TABLE表时联想到里面的字段等。快捷键:在编辑器上操作时可以使用快捷键来快速编写SQL。用户设置:针对OBS进行设置,可以全局指定OBS桶,在这个桶下面创建一个文件目录后,脚本默认会保存到该OBS桶的文件夹下面,无需再选择。可以设置数据库和schema权限过滤,开启开关后,根据当前的数据库用户过滤数据库的create权限以及过滤schema的usage权限。可以设置表列名注释显示开关,开启后,select * from[表名],返回结果时表头会带上列对应的注释信息。导出设置:针对OBS进行设置,对于用户全量导出指定的OBS桶和路径,以及可以设置全量查询超时时间控制,查询超时后导出任务终止。登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”。单击“设置”按钮,可根据需求设置相应参数。编辑器配置,前端控制字体,间距等显示内容。快捷键配置,提示用户可以使用哪些快捷键进行快速操作。用户设置,主要是对于脚本路径配置,数据库,模式和表的一些显示内容开关控制。导出设置,针对全量导出控制导出路径以及超时时间等配置。
  • [技术干货] 新增目录
    当前只支持两级目录,每一层目录每个用户最多支持10个,也就是每个用户最多支持创建100个目录,避免文件夹嵌套太深,后期不好维护。登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”切换至脚本面板。单击“新建目录”,也可以右键某个一级目录名称选择“新建目录”,这样会默认选择选择的目录作为父目录。保存到目录:下拉框选择保存至父级目录。如果为空,则该目录为一级目录。目录名称:设置目录名称,仅支持输入中文、英文、数字、下划线的组合。确认无误后,单击“确定”。脚本可以挂载在目录下去创建,也可以不挂载目录直接创建,创建脚本数量没有限制,脚本内容实际上是保存到OBS路径地址下。登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”切换至脚本面板。单击“新建脚本”,也可以直接点击“保存”,或者选中某一目录右键点击“新建脚本”。保存到目录:下拉框选择新增的目录夹。该选项为可选选项。脚本名称:设置脚本名称,仅支持输入中文、英文、数字、下划线的组合。OBS桶:存储脚本文件的OBS桶名称。如果没有可选择的OBS桶,可以单击“创建OBS桶”进入OBS管理控制台创建新的OBS桶。路径:在OBS中存储脚本文件的自定义目录。多级目录可用“/”进行分隔。路径取值范围:1~50个字符。如果不填写该路径,系统默认自动新增路径。
  • [技术干货] IAM用户导出按钮权限配置
    编辑器支持IAM主账号控制下面的子账号点击导出按钮权限,只有主账号有权限进行配置,如果对某个集群配置IAM子账号导出禁用权限,那么这个IAM子账号登录查询这个集群里的数据时,会将导出按钮置灰,不允许点击导出。登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”。切换至“数据源 > 自定义”面板,根据某个集群创建自定义数据源。右键点击自定义数据源名称,单击“导出权限”,在禁用导出权限列表中可查看此集群已禁用导出的IAM用户列表。单击列表上方的“添加禁用权限”按钮,可选择给同租户下的其它IAM子用户禁用导出按钮,并设置禁用导出截止时间。单击已禁用导出的IAM用户所在行操作列“取消禁用权限”按钮可取消禁用导出配置。单击已禁用导出的IAM用户所在行操作列“修改”按钮可修改禁用到期时间和IAM用户名。被禁用导出的IAM子用户登录时,在用这个集群创建自定义数据源点击查询数据时,导出按钮会置灰。
  • [技术干货] 共享自定义数据源
    编辑器支持IAM用户将自己创建的自定义数据源共享给同租户下的其它IAM用户,其它用户可以通过被分享的连接登录集群数据库,需要注意的点是,如果数据源没有保存密码,即使分享给其它用户,那么登录连接时也需要输入密码,并且被分享的数据源无法被(被共享人)再次共享。登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”。切换至“数据源 > 自定义”面板,创建自定义数据源,务必请记住密码。右键需要分享的自定义数据源名称,单击“共享数据源”,在共享列表中可查看此数据源已共享的IAM用户列表。单击列表上方的“添加共享”按钮,可选择给同租户下的其它IAM用户共享此数据源,并设置共享截止时间。单击已共享的IAM用户所在行操作列“取消共享”按钮可取消共享。单击已共享的IAM用户所在行操作列“修改”按钮修改共享到期时间和用户名。被共享的IAM用户登录时,可在自定义数据源列表中看到被共享的数据源,单击数据源名称可直接登录使用。