• [技术干货] GaussDB(DWS)新增特性
    在数字化、智能化时代,数据特征呈海量化、多样化发展,业务特征呈实时化、生态化发展,对支撑数据分析的数据仓库的弹性、性能等提出了新的挑战。因此,GaussDB(DWS)全面升级,打造云原生企业级数仓,其采用全对称分布式架构,没有中心节点,所有节点都可以提供服务,没有性能瓶颈,实现千万条/秒入库吞吐,毫秒级入库时延,兼顾吞吐和时延要求。DWS具有高性能、高扩展、高可靠等亮点,能够用一套软件替换多个数据组件,简化数据链路,统一运维,提供一站式数据分析解决方案。新一代全场景数仓GaussDB(DWS)新增以下关键特性:Serverless模式,支持按需资源,按需查询等灵活计费;架构创新,实现存算分离、冷热数据自动管理,降低存储成本;兼容Hudi/ORC/Parquet等开源数据格式,实现格式化和非格式化数据统一分析;表级细粒度容灾,按需创建容灾规模,最大化降低容灾集群投资。作为一款云原生数据仓库,能够支持PB级数据分析,GaussDB(DWS)在弹性扩展、高可靠性、易用性等方面也表现出色。用户可以根据业务需求灵活调整资源,无需担心资源不足或浪费的问题。同时,GaussDB(DWS)采用了多重备份和容灾策略,确保数据的安全可靠。此外,华为云还提供了丰富的工具和接口,使得用户能够轻松上手,快速构建数据分析平台。
  • [技术干货] 全方位HA设计
    (1) ACID支持分布式事务ACID(Atomicity,Consistency,Isolation,Durability),数据强一致保证。(2) 全方位HA设计GaussDB(DWS) 所有的软件进程均有主备保证,集群的协调节点(CN)、数据节点(DN)等逻辑组件全部有主备保证,能够保证在任意单点物理故障的情况下系统依然能够保证数据可靠、一致,同时还能对外提供服务。(3) 安全GaussDB(DWS) 支持数据透明加密,同时可与数据库安全服务(DBSS)对接,基于网络隔离及安全组规则,保护系统和用户隐私及数据安全。GaussDB(DWS)还支持自动数据全量、增量备份,提升数据可靠性。按需付费:GaussDB(DWS) 按实际使用量和使用时长计费。您需要支付的费率很低,只需为实际消耗的资源付费。门槛低:您无需前期投入较多固定成本,可以从低规格的数据仓库实例起步,后续随时根据业务情况弹性伸缩所需资源,按需开支。华为云GaussDB(DWS)一站式全场景云数据仓库,提供PB级数据分析能力、多模分析和实时处理能力,以统一内核提供公有云、混合云等部署形态,用户体验一致。在金融、泛政府、电信、能源、交通、医疗、物流、电商等领域,帮助1700+大客户规模商用。
  • [技术干货] 云化分布式架构
    (1) 云化分布式架构GaussDB(DWS) 采用全并行的MPP架构数据库,业务数据被分散存储在多个节点上,数据分析任务被推送到数据所在位置就近执行,并行地完成大规模的数据处理工作,实现对数据处理的快速响应。(2) 查询高性能,万亿数据秒级响应GaussDB(DWS) 通过算子并行执行、向量化执行引擎实现指令在寄存器并行执行,以及LLVM动态编译减少查询时冗余的条件逻辑判断,助力数据查询性能提升。GaussDB(DWS)支持行列混合存储,可以同时为用户提供更优的数据压缩比(列存)、更好的索引性能(列存)、更好的点更新和点查询(行存)性能。(3) 数据加载快GaussDB(DWS)提供了GDS极速并行大规模数据加载工具。按需扩展:Shared-Nothing开放架构,可随时根据业务情况增加节点,扩展系统的数据存储能力和查询分析性能。扩容后性能线性提升:容量和性能随集群规模线性提升,线性比0.8。扩容不中断业务:扩容过程中支持数据增、删、改、查,及DDL操作(Drop/Truncate/Alter table),表级别在线扩容技术,扩容期间业务不中断、无感知。支持在线升级:8.1.1及以上源版本支持大版本在线升级,8.1.3及以上源版本支持补丁在线升级,升级期间用户无需停止业务,业务存在闪级秒断。
  • [技术干货] 生态兼容性
    (1)社区工具兼容数据集成:Talend、Kettle、DataX、DBT、Informatica等。数据开发:Navicat、DBeaver、DbVisualizer等。作业调度:Dataphin、Airflow等。BI分析:QuickBI、永洪BI、FineBI、PowerBI、Tableau、Cognos、SmartBI等。(2)华为工具兼容:数据集成:CDM、DRS、Migration等数据开发:SQL Editor、DataArts Studio、DASBI分析:DataArts Insight(1) 一站式可视化便捷管理GaussDB(DWS) 让您能够轻松完成从项目概念到生产部署的整个过程。通过使用GaussDB(DWS) 管理控制台,您不需要安装数据仓库软件,也不需要部署数据仓库服务器,就可以在几分钟之内获得高性能、高可靠的企业级数据仓库集群。您只需单击几下鼠标,就可以轻松完成应用程序与数据仓库的连接、数据备份、数据恢复、数据仓库资源和性能监控等运维管理工作。(2) 与大数据无缝集成您可以使用标准SQL查询HDFS、对象存储服务(Object Storage Service,OBS)上的数据,数据无需搬迁。(3) 提供一键式异构数据库迁移工具GaussDB(DWS) 提供配套的迁移工具,可支持MySQL、Oracle和Teradata的SQL脚本迁移到GaussDB(DWS) 。
  • 语法兼容性
    GaussDB(DWS)是一款完全自主可控的国产数据库,兼容PostgreSQL生态,同时GaussDB(DWS)具备丰富的GP迁移成功经验。在某一迁移GP的成功案例中,面临客户原平台扩展性不足、数据加工链路长、数据分散等痛点问题,GaussDB(DWS)成功将Greenplum上数万个数据模型、数万个代码脚本、数百万行代码全部迁移至安全可控的数据仓库平台,基于GaussDB(DWS)的数据分析平台成功降低系统管理成本、技术复杂度,提升了资源配置效率、数据一致性,承载30000多个数据模型。GaussDB(DWS) 提供了配套的迁移工具,可支持TeraData、Oracle、MySQL、SQL Server、PostgreSQL、Greenplum、Impala等常用数据分析系统的平滑迁移。支持SQL 2003标准,兼容Oracle的部分语法和数据结构,支持存储过程,可与常用BI(business intelligence)工具无缝对接,业务迁移修改量极小。语法兼容性(1)Greenplum和DWS均支持SQL 2003,兼容大部分DDL与DML语法。(2)兼容GP所有数据类型。(3)兼容GP所有操作符。(4)兼容GP包括XML函数、JSON函数、窗口函数、聚集函数在内所有的复杂函数。(5)支持自定义函数和PROCEDURE。(6)支持Sort所有场景,包含FullSort/TopNSort。(7)支持Agg/Join/Sort落盘功能。(8)支持HashJoin/NestLoopJoin,完整支持Left/Right/Full/Inner/Anti/Semi六种Join规则。(9)支持 GroupAgg/HashAgg/PlainAgg,及Agg所有相关特性。(10)支持 HeapTable、Aocs Table的Scan,包含Seqscan和Index Scan。
  • [技术干货] 重置自增列的开始序号
    DWS如何重置自增列的开始序号?使用函数setval(regclass, bigint)对自增列值进行重置。DWS如何确定sequence和哪个表有关联?先在pg_class查找目标sequence的oid,然后在pg_depend根据oid查依赖该sequence的对象。如何查询序列的last_value?由于SEQUENCE在自增过程中并不是严格逐个增加,因此序列号中会存在空端数据,所以last_value本身并没有实际意义,可以采用函数lastval()进行查询。注意事项如果当前会话还没有调用过nextval,那么调用lastval将会报错。此外,lastval()函数在默认情况下是不支持的,需要通过设置enable_beta_features或者lastval_supported为true之后,才能使用这个函数。同时这种情况下,nextval()函数将不支持下推。如何查询SEQUENC的当前最新值?通过currval函数可以查询SEQUENC的当前最新值。如何解决SEQUENC取值超出范围的问题?1.可以在创建SEQUENC时设置CYCLE字段,从而使得序列达到maxvalue或者minvalue后可循环并继续下去。但需要注意,若定义序列为CYCLE,则不能保证序列的唯一性。2.通过调用setval(regclass, bigint)函数对序列取值进行重置。
  • [技术干货] setval参数
    新序列值的产生是靠GTM维护的,默认情况下,每申请一个序列值都要向GTM发送一次申请,GTM在当前值的基础上加上步长值作为产生的新值返回给调用者。GTM作为全局唯一的节点,势必成为性能的瓶颈,所以对于需要大量频繁产生序列号的操作,如使用Bulkload工具进行数据导入场景,是非常不推荐产生默认序列值的。比如,在下面所示的场景中, INSERT FROM SELECT语句的性能会非常慢。setval设置的新值,会对当前会话的nextval立即生效,但对其他会话,如果定义了cache,不会立即生效,在用尽所有缓存的值后,其变动才被其他会话感知。所以为了避免产生重复值,要谨慎使用setval,设置的新值不能是已经产生的值或者在缓存中的值。如果必须要在bulkload场景下产生默认序列值,则一定要为newSeq1定义足够大的cache,并且不要定义Maxvalue或者Minvalue。数据库会试图将nextval(‘sequence_name’)的调用下推到Data Node,以提高性能。 目前GTM对并发的连接请求是有限制的,当Data Node很多时,将产生大量并发连接, 这时一定要控制bulkload的并发数目,避免耗尽GTM的连接资源。如果目标表为复制表(DISTRIBUTE BY REPLICATION)时下推将不能进行。当数据量较大时,这对数据库将是个灾难。除了性能问题之外,空间也可能会剧烈膨胀,在导入结束后,需要用vacuum full来恢复。最好的方式还是如上建议的,不要在bulkload的场景中产生默认序列值。另外,序列创建后,在每个节点上都维护了一张单行表,存储序列的定义及当前值,但此当前值并非GTM上的当前值,只是保存本节点与GTM交互后的状态。如果其他节点也向GTM申请了新值,或者调用了Setval修改了序列的状态,不会刷新本节点的单行表,但因每次申请序列值是向GTM申请,所以对序列正确性没有影响。
  • [技术干货] lastval参数
    lastval()用于返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。需要注意的是,lastval()函数在默认情况下是不支持的,需要通过设置enable_beta_features或者lastval_supported为true之后,才能使用这个函数。同时这种情况下,nextval()函数将不支持下推。currval(regclass)用于返回当前会话里最近一次nextval返回的指定的sequence的数值。如果当前会话还没有调用过指定的sequence的nextval,那么调用currval将会报错。需要注意的是,这个函数在默认情况下是不支持的,需要通过设置enable_beta_features为true之后,才能使用这个函数。同时在设置enable_beta_features为true之后,nextval()函数将不支持下推。返回类型:bigintcurrval函数有两种调用方式(其中第二种调用方式兼容Oracle的语法,目前不支持Sequence命名中有特殊字符"."的情况)。Setval后当前会话及GTM上会立刻生效,但如果其他会话有缓存的序列值,只能等到缓存值用尽才能感知Setval的作用。所以为了避免序列值冲突,setval要谨慎使用。因为序列是非事务的,setval造成的改变不会由于事务的回滚而撤销。
  • [技术干货] DROP SEQUENCE语句的使用方法
    DROP SEQUENCE用于从当前数据库里删除序列。注意事项只有序列的所有者或者系统管理员才能删除。IF EXISTS如果指定的序列不存在,则发出一个notice而不是抛出一个错误。name序列名称。CASCADE级联删除依赖序列的对象。RESTRICT如果存在任何依赖的对象,则拒绝删除序列。此项是缺省值。序列函数为用户从序列对象中获取后续的序列值提供了简单的多用户安全的方法。DWS目前支持以下SEQUENCE函数:nextval(regclass)用于递增序列并返回新值。返回类型:bigintnextval函数有两种调用方式(其中第二种调用方式兼容Oracle的语法,目前不支持Sequence命名中有特殊字符"."的情况)为了避免从同一个序列获取值的并发事务被阻塞, nextval操作不会回滚;也就是说,一旦一个值已经被抓取, 那么就认为它已经被用过了,并且不会再被返回。 即使该操作处于事务中,当事务之后中断,或者如果调用查询结束不使用该值,也是如此。这种情况将在指定值的顺序中留下未使用的"空洞"。 因此,GaussDB(DWS)序列对象不能用于获得"无间隙"序列。如果nextval被下推到DN上时,各个DN会自动连接GTM,请求next values值,例如(insert into t1 select xxx,t1某一列需要调用nextval函数),由于GTM上有最大连接数为8192的限制,而这类下推语句会导致消耗过多的GTM连接数,因此对于这类语句的并发数目限制为7000(其它语句需要占用部分连接)/集群DN数目。
  • [技术干货] 指定序列与列的归属关系
    将序列和一个表的指定字段进行关联。在删除那个字段或其所在表的时候会自动删除已关联的序列。ALTER SEQUENCE用于修改一个现有的序列的参数。注意事项使用ALTER SEQUENCE的用户必须是该序列的所有者。当前版本仅支持修改拥有者、归属列和最大值。若要修改其他参数,可以删除重建,并用Setval函数恢复当前值。ALTER SEQUENCE MAXVALUE不支持在事务、函数和存储过程中使用。修改序列的最大值后,会清空该序列在所有会话的cache。ALTER SEQUENCE会阻塞nextval、setval、currval和lastval的调用。语法格式修改序列最大值或归属列。name将要修改的序列名称。IF EXISTS当序列不存在时使用该选项不会出现错误消息,仅有一个通知。MAXVALUE maxvalue | NO MAXVALUE序列所能达到的最大值。如果声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE。OWNED BY将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。如果序列已经和表有关联后,使用这个选项后新的关联关系会覆盖旧的关联。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。使用OWNED BY NONE将删除任何已经存在的关联。new_owner序列新所有者的用户名。用户要修改序列的所有者,必须是新角色的直接或者间接成员,并且那个角色必须有序列所在模式上的CREATE权限。
  • [技术干货] CYCLE参数
    为了快速访问,而在内存中预先存储序列号的个数。一个缓存周期内,CN不再向GTM索取序列号,而是使用本地预先申请的序列号。缺省值为1,表示一次只能生成一个值,也就是没有缓存。【注意】不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。建议cache值不要设置过大,否则会出现缓存序列号时(每个cache周期的第一个nextval)耗时过长的情况;同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会浪费序列号。为了快速访问,而在内存中预先存储序列号的个数。一个缓存周期内,CN不再向GTM索取序列号,而是使用本地预先申请的序列号。缺省值为1,表示一次只能生成一个值,也就是没有缓存。【注意】不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。建议cache值不要设置过大,否则会出现缓存序列号时(每个cache周期的第一个nextval)耗时过长的情况;同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会浪费序列号。用于使序列达到maxvalue或者minvalue后可循环并继续下去。如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。NOCYCLE的作用等价于NO CYCLE。缺省值为NO CYCLE。若定义序列为CYCLE,则不能保证序列的唯一性。
  • [技术干货] CREATE SEQUENCE语句的使用方法
    CREATE SEQUENCE用于向当前数据库里增加一个新的序列。序列的Owner为创建此序列的用户。注意事项Sequence是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。不支持在template1数据库中创建SEQUENCE。name将要创建的序列名称。取值范围: 仅可以使用小写字母(a~z)、 大写字母(A~Z),数字和特殊字符"#","_","$"的组合。increment指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。缺省值为1。MINVALUE minvalue | NO MINVALUE| NOMINVALUE执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUEMAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE
  • [技术干货] Sequence自增整数序列
    序列Sequence是用来产生唯一整数的数据库对象。序列的值是按照一定规则自增的整数。因为自增所以不重复,因此说Sequence具有唯一标识性。因此,在数据库中Sequence常常被作为主键使用。通过序列使某字段成为唯一标识符的方法有两种:是声明字段的类型为序列整型,由数据库在后台自动创建一个对应的Sequence。使用CREATE SEQUENCE自定义一个新的Sequence,然后将nextval(‘sequence_name’)函数读取的序列值,指定为某一字段的默认值,这样该字段就可以作为唯一标识符。方法一: 声明字段类型为序列整型来定义标识符字段。方法二: 创建序列,并通过nextval(‘sequence_name’)函数指定为某一字段的默认值。这种方式更灵活,可以为序列定义cache,一次预申请多个序列值,减少与GTM的交互次数,来提高性能。除了为序列指定了cache,方法二所实现的功能基本与方法一类似。但是一旦定义cache,序列将会产生空洞(序列值为不连贯的数值,如:1.4.5),并且不能保序。另外为某序列指定从属列后,该列删除,对应的sequence也会被删除。 虽然数据库并不限制序列只能为一列产生默认值,但最好不要多列共用同一个序列。当前版本只支持在定义表的时候指定自增列,或者指定某列的默认值为nextval(‘seqname’), 不支持在已有表中增加自增列或者增加默认值为nextval(‘seqname’)的列。
  • [技术干货] nextval参数
    序列操作函数nextval(),setval() 等均不支持回滚。另外setval设置的新值,会对当前会话的nextval立即生效,但对其他会话,如果定义了cache,不会立即生效,在用尽所有缓存的值后,其变动才被其他会话感知。所以为了避免产生重复值,要谨慎使用setval,设置的新值不能是已经产生的值或者在缓存中的值。如果必须要在bulkload场景下产生默认序列值,则一定要为newSeq1定义足够大的cache,并且不要定义Maxvalue或者Minvalue。数据库会试图将nextval(‘sequence_name’)的调用下推到Data Node,以提高性能。 目前GTM对并发的连接请求是有限制的,当Data Node很多时,将产生大量并发连接, 这时一定要控制bulkload的并发数目,避免耗尽GTM的连接资源。如果目标表为复制表(DISTRIBUTE BY REPLICATION)时下推将不能进行。当数据量较大时,这对数据库将是个灾难。除了性能问题之外,空间也可能会剧烈膨胀,在导入结束后,需要用vacuum full来恢复。最好的方式还是如上建议的,不要在bulkload的场景中产生默认序列值。另外,序列创建后,在每个节点上都维护了一张单行表,存储序列的定义及当前值,但此当前值并非GTM上的当前值,只是保存本节点与GTM交互后的状态。如果其他节点也向GTM申请了新值,或者调用了Setval修改了序列的状态,不会刷新本节点的单行表,但因每次申请序列值是向GTM申请,所以对序列正确性没有影响。
  • [应用案例] sql产生报错:ERROE:dn_xxxx_xxxx:numeric field overflow;DETAIL: A field with precision 18,scale 2 must round to an absolute..
    一、背景客户在执行业务sql产生报错:testdb=> select max(a) from ( select cast(coalesce(t1.b,0) as decimal(18,2)) as a from t1 left join b .... group by a);ERROR: dn_xxxx_xxxx:numeric field overflowDETAIL: A field with  precision 18,scale 2 must round to an absolute value less than 10^16.该报错为中间结果集溢出,修改为decimal为19位后查询最大值。发现max的结果为:testdb=>select max(a) from ( select cast(coalesce(t1.b,0) as decimal(19,2)) as a from t1 left join b .... group by a);           max---------------------11001152438310.00其中最大值 11 0011 5243 8310.00,只有14位整数,decimal(18,2)实际存储的整数位数应该是18-2=16位,最大值并不溢出。为何会产生报错呢。二、原因中间排查了很久,一直在原地打转。后大佬灵光一闪,查了一下最小值。testdb=>select min(a) from ( select cast(coalesce(t1.b,0) as decimal(19,2)) as a from t1 left join b .... group by a);           min----------------------13194682580278417.41最小值为-1 3194 6825 8027 8417.41,一共17位整数,加上2位小数,故decimal(18,2)溢出,但decimal(19,2)能查出结果。为什么查询最大值会去遍历最小值呢,因为sql最后一句testdb=>select min(a) from ( select cast(coalesce(t1.b,0) as decimal(19,2)) as a from t1 left join b .... group by a);子查询先进行分组,故进行遍历查询了t1.b列最小值,所以中间结果溢出,父查询只要最大值,看起来就像没溢出。补充:这里做个分享给大家,这个报错有点反逻辑,大部分人会认为max就是最大,从而忽略min,但在计算机中,不应该忽视最小值。
总条数:2749 到第 页
上滑加载中