• [GaussTech] 请问gaussdb 支持 postgre 模式吗?
    原来理解 gaussdb 支持postgre 是自然的事情,但是我们公司dba 反馈说  guassdb  未来可能不支持postgre  兼容模式,只支持oracle  和mysql 模式想确认是不是真的,原有基于postgre 开发了大量的存储过程等,迁移很麻烦
  • [用户实践] GaussDB高并发场景由于FASTPATH_PART默认参数过小引发锁等待导致数据库运行缓慢问题
    GaussDB高并发场景由于FASTPATH_PART参数引发锁等待导致数据库运行缓慢问题一、案例背景近期引发由于FASTPATH_PART默认参数过小引发锁等待导致数据库语句运行缓慢问题,可关注该参数设置,避免因默认参数未调整引发业务缓慢问题。二、案例描述业务侧多条语句大量等锁,其等待事件为LockMgrLock。处于LockMgrLock状态表示当前会话要对常规锁结构进行加锁,没有走fastpath流程。fastpath加锁流程(FASTPATH_PART:每个线程可以不通过主锁表拿锁的最大锁个数。)由于前三级锁之间没有任何冲突,为了减少加锁的代价,在一定不会出现冲突的前提下,前三级锁可以走fastpath流程。fastpath锁为线程内部资源,加锁效率高,在业务的并发量大,单事务访问的表数量多的场景下,会占用更多的fastpath资源。高并发场景使得fastpath数组被占满,导致后续对其他表加锁无法通过fastpath,大量并发线程走主锁表,进而导致出现大量LockMgrLock等待事件,导致业务运行缓慢。三、定位过程1、 查看卡顿时间点,发现有大量LockMgrLock等待事件。2、通过查询会话相关视图,发现现场环境活跃会话数量达到500多。3、查看gs_asp报告,可以看出从15:34开始,业务并发数上涨。4、XX业务量相对之前有所增加,查看监控确实相比之前增多。5、查看DN日志发现,提示fastpath资源不足大量并发线程走主锁表需要调整参数,进而出现大量LockMgrLock等待事件。四、处理建议参数作用:num_internal_lock_partitions 定义了锁管理器的分区数,旨在减少全局锁LockMgrLock的竞争。其中一部分分区(由 FASTPATH_PART 定义,这里是20)专门用于管理可以走fastpath的锁对象。问题所在:每个需要走fastpath的锁对象(如表、页、元组)会根据其哈希值映射到这20个fastpath分区中的一个。当一个事务/语句需要获取的fastpath锁对象数量过多(例如,由于扫描了400个分区,需要锁定大量表、页或元组),可能会占满或超出其对应的fastpath分区槽位。一旦超出限制,多余的锁请求无法再享受fastpath的优惠,必须回退到主锁表去申请。后果:FASTPATH_PART=20的设置在高并发、多分区扫描的场景下显得过小,大量本可以快速处理的锁请求被迫加入主锁表的竞争行列。num_internal_lock_partitions参数说明:控制内部轻量级锁分区的个数。主要用于各类场景的性能调优。•参数内容以关键字和数字的KV方式组织,各个不同类型锁之间以逗号隔开。•先后顺序对设置结果不影响。例如"CLOG_PART=256,CSNLOG_PART=512"等同于"CSNLOG_PART=512,CLOG_PART=256"。•重复设置同一关键字时,以最后一次设置为准。例如"CLOG_PART=256,CLOG_PART=2",设置的结果为CLOG_PART=2。参数类型:字符串参数单位:无取值范围:•CLOG_PART:CLOG文件控制器的个数。最小值为1,最大值为256。•CSNLOG_PART:CSNLOG文件控制器的个数。最小值为1,最大值为512。•LOG2_LOCKTABLE_PART:常规锁表锁分区个数的2对数。最小值4,即锁分区数为16;最大值为16,即锁分区数为65536。•TWOPHASE_PART:两阶段事务锁的分区数。最小值为1,最大值为64。•FASTPATH_PART:每个线程可以不通过主锁表拿锁的最大锁个数。最小值为20,最大值为10000。默认值:"CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1,FASTPATH_PART=20"设置方式:该参数属于POSTMASTER类型参数。设置建议:FASTPATH_PART:对于分区表读取、更新、插入、删除操作且等待事件在LockMgrLock时,可以通过调大该值避免获取LockMgrLock提升性能,建议调整数量大于等于分区数*(1+本地索引数量)+全局索引数量+10,调大该值可能增加锁转移和锁消除时的耗时,并会额外增加内存。fastpath增量内存=((fastpath增加量/20)*8 + fastpath增加量*12) * 线程池大小,单位是字节。参数修改需要重启数据库,需要在150< FASTPATH_PART<800范围内修改,调大该值可能增加锁转移和锁消除时的耗时,并会额外增加内存,调整前需测试充分后再到生产环境实施。五、问题触发原理数据库中用户对 object 进行操作时,需要持有对应对象的常规锁,因为常规锁通常在共享区中,为了保护锁获取满足 ACID,通过内部轻量级别锁 LockMgrLock进行保护。为了提升并发性能,在每个会话本地会有本地锁资源缓冲区(fast path),针对低级别锁,可以优先在本地缓冲区中不用进入共享区。本地fast path 可以容纳 20 个低级别锁,超过 fastpath 后,需要存入共享区。存入共享区时,会优先持有 LockMgrLock,此锁为分区锁,通过分区的机制来实现减少锁冲突。在高并发、多分区扫描的场景下默认参数过小,大量本可以快速处理的锁请求被迫加入主锁表的竞争行列,导致数据库缓慢运行。
  • [问题求助] gaussdb的cgroup相关视图含义是什么?
    有如下两个视图,查询出来结合产品文档看含义不太明白。一、gs_all_control_group_info视图SELECT * FROM gs_all_control_group_info;type为TSWD代表什么意思?class和workload是什么关系?包含关系吗?shares和limits的区别是啥?何为配额何为限额?控制组层级又是什么含义?看产品文档看的一头雾水,能否出个博客专门普及一下基础知识,并说明一下gaussdb的控制组功能运行逻辑?二、gs_wlm_cgroup_info视图select * from GS_WLM_CGROUP_INFO;priority作业优先级,各个值是怎么来的?值越大优先级越低吗?-1代表什么意思?usage_percent为何都是0?各个控制组shares的值怎么计算的?   
  • CodeArt Req对数据库进行领域建模
    2024年9月和10月在华师的数据库课堂指导学生利用CodeArt Req进行领域建模,画出系统的类图,42名同学利用工具,12名同学能够在较短的时间自己摸索工具的使用,完成作业。详细资料见链接。通过网盘分享的文件:Code Art链接: https://pan.baidu.com/s/1ejRwDeR3DzRgHG9qiaPQ2w?pwd=axci 提取码: axci
  • [问题求助] PG_STAT_REPLICATION视图中write,flush,replay的理解
    gaussdb集中式主备版,pg_stat_replication视图的以下字段如何理解?接收端write具体是指写到哪里?flush是在做什么?replay是在做什么?麻烦稍微回答细致一些,感谢!
  • [技术干货] 云数据库选购 6 大误区:90% 企业都踩过的坑!
    在数字化转型加速的今天,云数据库早已成为企业存储数据、支撑业务的核心基础设施。无论是初创公司的小型应用,还是大型企业的核心业务系统,几乎都离不开云数据库的支持。但很多企业在选购云数据库时,往往陷入“凭感觉、看价格、听宣传”的误区,忽略了自身业务需求、数据特性和长期运维成本,导致买错产品、资源浪费、业务中断等问题——据统计,90% 的企业在云数据库选购过程中,都踩过至少一个坑。本文将客观拆解云数据库选购的 6 大核心误区,每个误区都结合「误区表现」「多维度对比」「误区危害」「正确做法」,全程通俗易懂,不堆砌专业术语,不涉及任何品牌信息,帮企业避开陷阱,选到最适配自身需求的云数据库。  核心原则先明确:云数据库选购的本质是「适配业务、平衡成本、保障稳定」,没有最好的产品,只有最适合自己的选择,盲目追求“高端”“便宜”“热门”,最终都会得不偿失。误区一:只看价格,忽略“隐性成本”这是最常见的误区,尤其是中小企业,往往将价格作为选购的核心甚至唯一标准,觉得“只要能存储数据,越便宜越好”,却忽略了云数据库的隐性成本——后续的运维、扩容、故障排查、数据迁移等,往往比初期采购成本更高。对比维度误区选择(只看低价)正确选择(兼顾隐性成本)初期采购成本极低,甚至有免费试用期限,短期性价比高中等,符合自身预算,不盲目追求低价运维成本极高,无内置运维工具,需单独招聘专业人员,故障排查耗时久较低,提供内置运维工具(如自动备份、故障告警),无需大量专业人员投入扩容成本隐性收费多,扩容时需额外支付高额手续费,且扩容过程繁琐,影响业务扩容规则透明,无隐性收费,支持弹性扩容,不影响业务正常运行长期总成本远高于预期,低价初期节省的成本,会被后续隐性成本抵消,甚至翻倍可控,初期投入合理,后续无额外隐性支出,长期性价比更高误区危害:短期看似节省了成本,长期来看,运维人力投入、故障损失、扩容费用等隐性成本会不断累积,甚至可能因为低价产品的稳定性差,导致业务中断,造成更大的经济损失。正确做法:选购时,不要只看初期报价,要计算“长期总成本”——将初期采购、运维、扩容、备份、故障处理等所有可能产生的费用都纳入考量,优先选择“报价透明、隐性成本低”的产品,结合自身业务规模,选择性价比最优的方案,而非单纯最便宜的方案。误区二:盲目追求“高配置”,资源浪费严重很多企业认为“配置越高,性能越好,越能支撑业务”,盲目选购高CPU、大内存、高存储的云数据库,却忽略了自身业务的实际需求——大部分中小企业的业务场景,根本用不到高端配置,高配置带来的不仅是高额成本,还有资源的严重浪费。对比维度误区选择(盲目高配置)正确选择(适配业务配置)配置规格CPU、内存、存储均选最高档,远超业务实际需求根据业务并发量、数据量,选择刚好适配的配置,预留10%-20%扩容空间资源利用率极低,通常不足30%,大量CPU、内存资源闲置合理,资源利用率维持在60%-80%,既不浪费,也不影响性能成本支出高额,高配置导致每月费用翻倍,且闲置资源无法抵扣成本合理,配置适配业务,每月成本可控,无闲置资源浪费业务适配性配置冗余,反而可能因为配置过高导致资源调度复杂,影响部分业务响应速度配置精准适配业务,响应速度、稳定性都能满足需求,无冗余负担误区危害:高额的配置费用会给企业带来不必要的资金压力,闲置的资源无法发挥价值,相当于“花高价买了用不上的东西”;同时,过高的配置可能导致系统调度复杂,反而影响业务的正常运行。正确做法:先梳理自身业务需求——统计日常并发量、数据存储量、业务响应速度要求,结合未来1-2年的业务增长预期,选择“适配当前、预留空间”的配置。例如,初创公司的小型应用,无需选择高端配置,基础配置即可满足需求;随着业务增长,再通过弹性扩容逐步提升配置,避免一次性投入过高。误区三:忽视“数据一致性”,适配场景选错云数据库有不同的存储引擎和架构,不同类型的数据库,在数据一致性、并发处理、读写性能上有很大差异。很多企业选购时,不了解自身业务的“数据一致性需求”,盲目选择热门类型,导致数据错乱、业务异常。业务场景数据一致性需求误区选择正确选择电商交易、金融支付强一致性(必须保证数据准确,无错乱)弱一致性数据库强一致性数据库内容存储、日志分析弱一致性(允许短暂数据不一致,不影响核心业务)强一致性数据库弱一致性数据库企业ERP、客户管理系统中强一致性(核心数据一致,非核心数据可容忍短暂不一致)极端强/弱一致性数据库中强一致性数据库比如,电商交易、金融支付等场景,需要强数据一致性(即同一数据在不同节点的读取结果一致),而部分企业却选择了弱一致性的数据库;反之,内容存储、日志分析等场景,对一致性要求不高,却选择了强一致性数据库,导致性能浪费。正确做法:先明确自身业务的“数据一致性需求”,再选择对应的云数据库类型。核心原则:核心业务(交易、支付、核心数据管理)优先选择强一致性数据库;非核心业务(日志、内容存储)可选择弱一致性数据库,平衡性能和成本。误区四:不重视“备份与容灾”,埋下安全隐患数据是企业的核心资产,一旦数据丢失、损坏,可能导致业务中断、企业倒闭。但很多企业选购云数据库时,只关注存储和性能,忽视了备份与容灾能力,甚至认为“云数据库不会出问题”,埋下巨大安全隐患。很多低价云数据库,不提供自动备份功能,或备份频率低、备份存储时间短;部分数据库虽然提供备份,但容灾能力薄弱,一旦发生机房故障、自然灾害,数据无法快速恢复,导致业务长时间中断。对比维度误区选择(忽视备份容灾)正确选择(重视备份容灾)备份功能无自动备份,需手动备份,或备份频率低(每周1次),备份存储时间短(7天以内)支持自动备份(每日至少1次),备份存储时间可自定义(建议90天以上),支持手动备份补充容灾能力单节点部署,无容灾机制,机房故障时数据丢失、业务中断多节点部署,支持跨区域容灾,机房故障时可快速切换节点,数据不丢失、业务不中断恢复能力恢复流程繁琐,耗时久(数小时甚至数天),且可能出现数据丢失支持一键恢复,恢复速度快(分钟级),可恢复到任意备份时间点,数据无丢失安全隐患极高,数据丢失、损坏后无法恢复,可能导致业务瘫痪极低,多重备份+容灾机制,最大限度保障数据安全和业务连续性误区危害:一旦发生数据丢失(如误操作、黑客攻击、机房故障),无法快速恢复,导致业务中断,核心数据丢失,给企业带来不可挽回的损失;部分行业(如金融、医疗)还可能因数据丢失不符合合规要求,面临处罚。正确做法:选购时,将备份与容灾能力作为核心考量因素之一,重点关注3点:① 是否支持自动备份,备份频率和存储时间是否可自定义;② 是否支持多节点部署和跨区域容灾;③ 恢复流程是否简单、恢复速度是否快捷。同时,定期测试备份恢复功能,确保出现问题时能正常使用。误区五:忽略“兼容性”,导致数据迁移困难很多企业选购云数据库时,只关注当前业务的适配性,忽略了数据库的兼容性——包括与现有系统、应用程序的兼容性,以及数据迁移的便捷性。后续随着业务发展,需要升级、迁移数据库时,才发现兼容性不足,导致迁移困难、成本高昂,甚至影响业务正常运行。常见的兼容性问题:数据库语法不兼容(现有应用程序无法适配新数据库语法)、接口不兼容(无法与现有系统对接)、数据格式不兼容(迁移时数据错乱、丢失)。对比维度误区选择(忽略兼容性)正确选择(重视兼容性)与现有系统兼容性不兼容现有应用程序、系统接口,需大规模修改代码才能适配兼容现有应用程序和系统接口,无需大规模修改代码,可快速对接数据迁移便捷性无迁移工具,迁移流程繁琐,需手动处理数据,易出现数据错乱、丢失提供内置迁移工具,支持一键迁移,迁移过程简单,数据无丢失、无错乱后续升级兼容性升级后与现有系统、应用程序不兼容,需重新适配,成本高昂支持平滑升级,升级后不影响现有系统和应用程序,兼容性稳定迁移成本极高,需投入大量人力、时间修改代码、处理数据,甚至影响业务中断较低,无需大规模修改代码,迁移效率高,不影响业务正常运行误区危害:后期需要迁移、升级数据库时,会面临“迁移困难、成本高昂、数据丢失”等问题,甚至需要暂停业务进行迁移,影响企业正常运营;若兼容性问题无法解决,可能需要重新选购数据库,造成双重成本浪费。正确做法:选购前,梳理现有系统、应用程序的技术架构,确认云数据库的兼容性——包括语法、接口、数据格式等;同时,询问厂商是否提供迁移工具、迁移服务,以及迁移过程中的技术支持,优先选择“兼容性强、迁移便捷”的产品。误区六:过度依赖“厂商服务”,忽视自身运维能力很多企业认为,选购云数据库后,所有问题都可以依赖厂商的服务,自身无需投入运维人员,忽视了自身运维能力的建设。但实际上,厂商的服务主要集中在数据库本身的稳定性(如故障修复、版本升级),而企业的业务数据、应用适配、日常运维(如数据监控、权限管理),仍需要自身运维人员负责。部分企业过度依赖厂商服务,一旦出现业务层面的问题(如数据异常、应用适配问题),无法及时排查解决,导致业务中断;同时,若自身运维能力不足,也无法充分发挥云数据库的性能,甚至可能因操作不当,导致数据安全隐患。对比维度误区选择(过度依赖厂商服务)正确选择(平衡厂商服务与自身运维)自身运维投入无专业运维人员,所有问题都依赖厂商,响应速度慢配备1-2名专业运维人员,负责日常运维、数据监控、问题排查厂商服务依赖度100%依赖,即使是简单的日常运维问题,也需要联系厂商解决合理依赖,数据库本身的故障、升级依赖厂商,日常运维、业务适配自主解决问题响应速度慢,需等待厂商反馈,可能导致业务长时间中断快,日常问题自主解决,重大故障联系厂商,响应及时,减少业务中断时间数据库利用率低,因自身运维能力不足,无法充分发挥数据库性能,资源浪费高,运维人员熟悉数据库特性,可根据业务需求优化配置,充分发挥性能误区危害:过度依赖厂商服务,会导致问题响应不及时,影响业务连续性;同时,自身运维能力不足,无法及时发现数据异常、优化配置,不仅会浪费资源,还可能埋下数据安全隐患;若厂商服务中断,企业将陷入无法运维的困境。正确做法:选购云数据库时,既要关注厂商的服务能力(如故障响应速度、技术支持水平),也要重视自身运维能力的建设——配备专业运维人员,或对现有人员进行培训,掌握云数据库的日常运维、问题排查技巧;同时,选择“运维门槛低、提供完善运维工具”的云数据库,降低自身运维压力。最后:选购核心总结+企业避坑建议以上6大误区,本质上都是“需求与选择脱节”——企业没有明确自身业务需求、数据特性、成本预算,盲目跟风、凭感觉选购,最终导致踩坑。云数据库选购没有统一的标准,核心是“适配自身”,记住以下3点,可避开90%的坑:1. 先明确需求,再选择产品:梳理自身业务的并发量、数据量、数据一致性需求、备份容灾需求,结合成本预算,划定选购范围,不盲目追求高端、低价、热门。2. 兼顾短期成本与长期价值:不要只看初期采购成本,要计算长期总成本,重视隐性成本、兼容性、可扩展性,避免后期迁移、升级、运维带来的额外负担。3. 平衡厂商服务与自身运维:不过度依赖厂商服务,也不忽视自身运维能力建设,选择运维门槛低、服务完善的产品,确保业务稳定运行。对于企业而言,云数据库的选购不是“一次性决策”,而是需要结合业务发展动态调整。初期可选择适配当前业务的产品,随着业务增长,逐步优化配置、升级产品;同时,定期复盘数据库的使用情况,及时发现问题、调整方案,才能让云数据库真正成为支撑业务发展的核心力量。
  • [问题求助] 关于gaussdb(集中式版)当中视图的分类
    开发指南(集中式)当中,对adm、db、my类型视图有说明,未说明pg、gs类型的视图。gs_*类型的视图与其他4中类型的视图有何区别?gs类型视图的用途是啥?pg_*类型的视图,是和原生pg保持一致的吗?还是有所改动?GS_STAT_ALL_PARTITIONS视图当中的n_tup_hot_upd字段,描述为热更新行数(比如没有更新所需的单独索引)。不太理解,什么是热更新?
  • [问题求助] 关于GaussDB当中分区表的索引的理解
    gaussdb当中,分区表的索引有global和local两种。当指定为global或使用默认值时,这个索引是否就是普通索引,未进行索引层面的分区?之所以有这种疑问,是由于Oracle数据库中,分区表的索引,分成了global index,global partitioned index。想知道gaussdb是否也如此?gaussdb是不是不支持索引的全局hash分区,即global hash partitioned index?当指定为local时,索引的分区是不是和表的分区一一对应?包括分区键、分区类型?
  • [问题求助] 自动统计信息收集的阈值
    通过文档了解到统计信息自动收集由autovacuum线程来做,阈值是从上一次autoanalyze后表元组的变化数量 > autovacuum_analyze_threshold +autovacuum_analyze_scale_factor * reltuples 。autovacuum_analyze_threshold、autovacuum_analyze_scale_factor由参数控制reltuples是pg_class中的字段值。请问自从上一次autoanalyze后表元组的变化数量是存在什么地方的,已了解到pg_stat_all_tables中的n_tup_ins、n_tup_upd、n_tup_del并不会在做完analyze后重置。
  • [问题求助] GaussDB ADM_TAB_PARTITIONS视图的num_rows字段咨询
    ADM_TAB_PARTITIONS视图的num_rows字段,记录的行数是来自统计信息吗?还是真实的行数?
  • [技术干货] 事务隔离级别核心概念
    一、事务隔离级别核心概念事务隔离级别(Transaction Isolation Level)是数据库用来解决并发事务冲突的规则,核心解决三类问题:  脏读:读取到其他事务未提交的数据  不可重复读:同一事务内多次读取同一数据,结果不一致  幻读:同一事务内多次执行同一查询,结果集行数不一致二、数据库四大隔离级别隔离级别脏读不可重复读幻读说明READ UNCOMMITTED(读未提交)✅✅✅最低级别,允许读取未提交的数据,性能最高但数据最不可靠READ COMMITTED(读已提交)❌✅✅OpenGauss/MySQL 默认级别,只能读取已提交的数据,解决脏读REPEATABLE READ(可重复读)❌❌✅同一事务内多次读取数据一致,解决不可重复读(InnoDB 可解决幻读)SERIALIZABLE(串行化)❌❌❌最高级别,事务串行执行,完全解决并发问题,但性能最差(锁表级别)三、 隔离级别注意事项  SERIALIZABLE 级别:仅适用于数据一致性要求极高的场景,普通业务不建议使用,会导致并发性能大幅下降;  默认级别 READ COMMITTED:满足大部分场景,既能避免脏读,又能保证并发性能;  隔离级别与锁:级别越高,数据库加的锁越多(行锁→表锁),需在 “一致性” 和 “性能” 之间平衡。
  • [吐槽&反馈] GaussDB是否有计划搭建一个类似于Oracle MOS的问题发布网站?
    目前GaussDB,遇到问题大部分都要找原厂,但是原厂资源有限,响应速度不够快。社区知名度也不高,是否有计划,推出一个专门用于问题处理的网站?或者说论坛版块?
  • [问题求助] HCIA(GaussDB for Mysql)
    有人考过HCIA(GaussDB for Mysql),想了解一下
  • [技术交流] 源代码:大批量SQL代码语法转换简单实例:ORACLE START WITH CONNECT 语法改写
    ### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换### 案例演示:# 假设 ORACLE START WITH CONNECT 语法代码( start_with_connect.sql ):SELECT * FROM tree START WITH id = 1 CONNECT BY NOCYCLE PRIOR id = parentid ;# 配置转换规则可以将以上代码直接转换成如下代码(改写成with recursive语法):with recursive wr_tree as ( SELECT id, parentid, 1 as level from tree where id = 1 union SELECT tree.id, tree.parentid, level + 1 from tree, wr_tree where tree.parentid = wr_tree.id ) SELECT * from wr_tree order by id ;# 转换规则( STATR_WITH_CONNECT_SQL_REPLACE.syn )如下所示:__DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __IF_KW__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ __DEF_PATH__ __START_WITH_CONNECT__ 1 : sel @ %__IF_KW__ | select : cc @ | * : frm @ | from : srctab @ | __NAME__ : sta @ %__IF_KW__ | start : wth @ %__IF_KW__ | with : swp @ | __NAME__ : dy1 @ | = : int @ | __INT__ : str @ + __STRING__ : cnn @ %__IF_KW__ | connect : by @ %__IF_KW__ | by : ncy @ %__IF_KW__ CAN_SKIP | nocycle : prr1 @ %__IF_KW__ CAN_SKIP | prior : col1 @ | __NAME__ : dy @ | = : col2 @ | __NAME__ : end @ | ; ----------------------------------------------------------------------- 1 : sel @ | with : sel @ | recursive : sel @ | wr_ : srctab @ \ __NAME__ : sel @ STRING | as : sel @ | __\n__ : sel @ | ( : sel @ | __\n__ : sel @ | select : col1 @ / __NAME__ : col2 @ \ , : col2 @ / __NAME__ : sel @ STRING \ , 1 as level from : srctab @ / __NAME__ : sta @ / where : swp @ / __NAME__ : dy1 @ / = : int @ / __INT__ : str @ / __STRING__ : sel @ | __\n__ : sel @ | union : sel @ | __\n__ : sel @ | select : srctab @ / __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : col2 @ \ , : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : sel @ STRING \ , level + 1 from : srctab @ / __NAME__ : srctab @ \ , : sel @ / wr_ : srctab @ \ __NAME__ : sta @ / where : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : dy1 @ / = : sel @ / wr_ : srctab @ \ __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : sel @ | __\n__ : sel @ STRING | ) : sel @ | __\n__ : sel @ | select : sel @ | * : sel @ STRING | from : sel @ | wr_ : srctab @ \ __NAME__ : sel @ / order : sel @ / by : col1 @ / __NAME__ : end @ | ; __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | '    
  • [问题求助] query_id,unique_query_id,debug_query_id三者的含义及区别
    在gaussdb中,很多视图都带有query_id,unique_query_id,debug_query_id三个字段。query_id描述为查询语句的ID,unique_query_id描述为归一化SQL id,debug_query_id描述为唯一SQL id。官方文档的描述看不懂,请解释一下3个字段的含义。三个字段有什么区别,有什么联系?分别适用于什么场景?