• [技术干货] 如何写出性能最优的函数
    类似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用户登录时,可在自定义数据源列表中看到被共享的数据源,单击数据源名称可直接登录使用。
  • [技术干货] 计划诊断
    登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”。切换至“数据源”面板,登录需要输入SQL语句的数据源,选择编辑框面板上方对应的数据库和模式。在编辑框内输入查询类的SQL语句,单击“计划诊断”按钮,可以选择“EXPLAIN”或者“PERFORMANCE”。说明:每次只能诊断单条查询类SQL语句,选择多条,默认对第一条进行诊断,选择PERFORMANCE诊断会真实执行输入的SQL进行返回结果。单击“确定”后,会跳转到“计划诊断”页面,查看SQL语句诊断结果和计划诊断可视化以及结果。单击“SQL诊断”显示SQL语句的格式化以及诊断项。切换“计划诊断”显示查询SQL的计划树形节点以及计划诊断结果。单击schema列表中某一个schema名称,进入到普通表列表,可以查看表行数,表大小和索引大小等信息。:这里的表行数拿的是一个预估值,可能会不准,如果需要准确获取这个值,可以提前refresh metadata元数据,刷新后查看正确的值。
  • [技术干货] 导出数据
    登录GaussDB(DWS)管理控制台。在左侧导航栏中,选择“数据 > SQL编辑器”。切换至“数据源”面板,登录需要导出数据的数据源,选择编辑框面板上方对应的数据库和模式。在编辑器框内输入查询SQL语句,单击“运行”按钮。单击查询结果下的“导出”按钮。schema结构文件转储:可以选择某个用户模式导出该模式下表,视图,函数,触发器,序列,同义词等元数据的ddl语句以及表的插入语句。本地导出:将查询SQL的所有结果导出到xlsx或csv文件,可直接在本地打开查看,最多支持导出20000条数据。全量导出:将查询SQL的所有结果导出到指定的OBS桶下的路径中,默认为csv文件。导出任务创建成功后,选择页面右上角“常用功能 > 导出任务”,在导出数据列表查看导出的任务。导出任务成功后,可单击所在行“文件地址”列的路径,跳转至OBS界面下载导出成功的csv或者sql文件。提交SQL任务成功后,选择页面右上角“常用功能 > SQL任务”,在SQL任务列表查看执行的SQL任务。执行任务结束后,可以单击所在行操作列的“详情”按钮查看每条SQL的执行情况。
  • [其他问题] DWS FI Manager 租户资源->概述下面的实时图表,显示无监测数据怎么处理?
    DWS FI Manager 租户资源->概述下面的实时图表,显示无监测数据怎么处理?
  • [SQL] GaussDB(DWS) 优雅的传入数据和表join
    在我们编写业务逻辑时,我们偶尔会遇见这种场景,需要在sql里传入一堆数据,和表进行join当然最简单也合理的方法是 in (xxx,xxx,xxx)但有时的业务in无法满足,比如要进行left join或者right join的时候有人就开始动脑筋了,那我来个子查询,把要输入的数据转成数组,再unnset不就行了吗?但是SELECT UNNEST(string_to_array('xxx,xxx,xxx',','))这种写法,会导致语句不能向量化,所以不推荐推荐如下写法:with t1(a) as (values('xxx'),('xxx'),('xxx'))select * from t1,test_table where test_table.id = t1.a; 进一步拓展,如果传入的数据是多列,这种写法同样能支持:with t1(a,b) as (values('xxx','yyy'),('xxx','yyy'),('xxx','yyy'))select * from t1,test_table where test_table.id = t1.a;  
  • [分享交流] 鸿蒙6技术未来发展趋势大家怎么看
    鸿蒙6技术未来发展趋势大家怎么看
  • [技术干货] 大数据干货合集(2025年10月)
    多队列LRUcid:link_2TTL 策略cid:link_3TTL队列的淘汰cid:link_4多盘缓存cid:link_5缓存预热cid:link_6表级缓存策略指定cid:link_7使用 TTL 策略进行缓存cid:link_8空间远大于我实际的数据量cid:link_9缓存占用差异很大cid:link_0SQL编辑器cid:link_10自定义创建连接cid:link_11数据开发操作cid:link_1新建普通/分区表cid:link_12操作列/索引/约束/分区cid:link_13导入数据https://bbs.huaweicloud.com/forum/thread-02107197291903243116-1-1.html
总条数:2552 到第
上滑加载中