-
rt.时区是一样的,就时间不对,修改服务器的时间的步骤是什么?怕乱改会有什么影响。
-
1.1 Power BI介绍Power BI是微软官方推出的可视化数据探索和交互式报告工具。 1.2 环境准备软件环境要求DWS 已经在华为云上购买完成。Power BI已经安装完成。 数据库环境设置create user upowerbi identified by "Huawei@123";grant connect on database tpcdsdb to upowerbi;\c tpcdsdbgrant usage on schema tpc_ds to upowerbi;grant select on all tables in schema tpc_ds to upowerbi; 1.3 在Power BI服务器端配置DWS ODBC驱动ODBC 驱动下载https://support.huaweicloud.com/mgtg-dws/dws_01_0032.html ODBC 驱动安装https://support.huaweicloud.com/mgtg-dws/dws_01_0086.html ODBC 数据源在PoweBI中打开该链接进行连接常见问题ODBC 驱动包的选择在华为云上,选购了windows server 2012 ECS之后,必需选择,否则会安装失败dws_1.2.x_odbc_driver_for_windows.tar.gz ECS中安装dws 1.7时,运行报如下错误dws_1.7.x_odbc_driver_for_windows.zip问题1:64bit的驱动无法安装问题2:ODBC使用32bit的驱动创建DSN时,报错均报如下错误ODBC 驱动包的版本驱动程序要与系统的体系结构一致,即64bit的系统,选择64bit的驱动
-
【功能模块】背景是这样的:当前有一套FI大数据集群和GaussDB集群,每天需要把增量数据从FI复制一份到GaussDB中,有什么好的方案?1)gds虽然可以实现这个需求,但是需要单独的GDS服务器,还有数据的导出、导入过程,方案较繁琐。听说SDR也可以,但是收费。2)在GaussDB中通过创建HDFS外表,可以直接访问HDFS的数据,可以满足需求。但是这种方案的效率怎么样?在别的局点有应用过吗?对原有的大数据集群有多大的影响(例如会不会拖垮大数据集群,当前FI主要是使用Elk组件做查询)?【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
迁移背景:从Oracle + apex 转向 DWS + 帆软其中apex通过匿名块拼接SQL语句,再执行语句获得查询结果帆软不支持类似于APEX的"两阶段"执行方式,仅支持一次性返回报表结果解决方法:将匿名块跟执行SQL封装在一个function中,上层直接调用对应的SQL语句获取对应的报表的结果。客户侧从备份文件中获取PLSQL语句,格式较为统一,考虑转换function脚本自动化。脚本设计:(1)APEX绑定参数均为[:P]开头,脚本可识别为入参。(2)function需要定义出参类型,目前没想到一劳永逸的返回任意类型方案。但DWS在执行function时如果出参个数及其类型与实际执行结果不符时会报错,可以利用这一点进行function的修改。脚本输出:(1)通过declare及end识别匿名块(1)识别匿名块的绑定参数,生成function的定义,入参确定,出参使用returns table,初始化状态仅指定一个出参,类型默认为text。(2)调用函数,出参默认使用null值,此时DWS存在三类报错a.function定义的出参个数与function实际的返回字段数不符:函数定义新增一个字段,默认类型还是text类型,直至无此报错b.function定义的出参类型与function实际的返回字段类型不符:修改对应出参类型为正确的类型,直至无此报错c.其他语法等报错:跳过该匿名的转换,后续手工修改语法问题:1、数字开头的对象名需要用双引号包围,否则会语法报错postgres=# create table test("48小时出货量" int)distribute by hash("48小时出货量"); CREATE TABLE postgres=# \d+ test; Table "public.test" Column | Type | Modifiers | Storage | Stats target | Description --------------+---------+-----------+---------+--------------+------------- 48小时出货量 | integer | | plain | | Has OIDs: no Distribute By: HASH(48小时出货量) Location Nodes: ALL DATANODES Options: orientation=row, compression=no postgres=# select "48小时出货量" from test; 48小时出货量 -------------- (0 rows)2、双引号可以使得对象名保持大写,Oracle默认对象名大写,DWS默认小写,如果有双引号DWS查询时也需要双引号+大写postgres=# create table test(ID int, GRADE int, "SCORE" int)distribute by hash(ID); CREATE TABLE postgres=# \d+ test; Table "public.test" Column | Type | Modifiers | Storage | Stats target | Description --------+---------+-----------+---------+--------------+------------- id | integer | | plain | | grade | integer | | plain | | SCORE | integer | | plain | | Has OIDs: no Distribute By: HASH(id) Location Nodes: ALL DATANODES Options: orientation=row, compression=no postgres=# select id,GRADE ,"SCORE" from test; id | grade | SCORE ----+-------+------- (0 rows)3、DECODE/CASE WHEN表达式的不同结果需要类型一致postgres=# select to_char(日期,'yyyy-mm-dd') 日期,DECODE(sign("时段"-10),-1,'0'||"时段","时段") 时段 from APEX_ACTIVE_USER_H; ERROR: CASE types numeric and text cannot be matched LINE 1: ...日期,'yyyy-mm-dd') 日期,DECODE(sign("时段"-10),-1,'0'||"时段... ^ CONTEXT: referenced column: 时段 postgres=# select to_char(日期,'yyyy-mm-dd') 日期,DECODE(sign("时段"-10),-1,'0'||"时段","时段"::text) 时段 from APEX_ACTIVE_USER_H; 日期 | 时段 ------+------ (0 rows) postgres=# select to_char(日期,'yyyy-mm-dd') 日期,DECODE(sign("时段"-10),-1,('0'||"时段")::numeric,"时段") 时段 from APEX_ACTIVE_USER_H; 日期 | 时段 ------+------ (0 rows) postgres=# \d+ APEX_ACTIVE_USER_H Table "public.apex_active_user_h" Column | Type | Modifiers | Storage | Stats target | Description ----------+--------------------------------+-----------+----------+--------------+------------- id | numeric | not null | main | | 日期 | timestamp(0) without time zone | | plain | | 时段 | numeric | | main | | 渗透类型 | character varying(100) | | extended | | 活跃人数 | numeric | | main | | Indexes: "apex_active_user_h_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default Has OIDs: no Distribute By: HASH(id) Location Nodes: ALL DATANODES Options: orientation=row, compression=no4、针对date类型的trunc函数需要使用date_trunc替代,因为性能问题不建议使用自定义trunc函数PS:date_trunc('YEAR/QUARTER/MONTH/WEAK/DAY',date),第二个入参必须是时间类型,如果为字符类型必须先转换为时间类型postgres=# \df date_trunc List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage ------------+------------+-----------------------------+-----------------------------------+--------+------------+------------ pg_catalog | date_trunc | interval | text, interval | normal | f | f pg_catalog | date_trunc | timestamp without time zone | text, timestamp without time zone | normal | f | f pg_catalog | date_trunc | timestamp with time zone | text, timestamp with time zone | normal | f | f (3 rows)5、function如果直接select null,返回类型为text6、匿名块的设计可能存在多分支多语句,不同语句其返回字段的类型可能不同,此时需要加强制类型转换确保不同SQL返回字段类型相同PS:上层报表的字段数量是一定的,所以返回结果集字段的数量不会有变化7、pivot可通过decode/case when语句进行改写,decode更简洁,推荐使用。可视情况使用group by / group by rollup-- pivot行转列 使用sum + group by [rollup] 输出分组列名不存在的行即可 select * from ( select "时段", "订单数量" from APEX_ORDER_ANALYSIS_HB_HOUR where "下单日期" =to_date('2021-04-05','yyyy-mm-dd')) pivot (sum("订单数量") for "时段" in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)); select "0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23" from( select 时段, sum(decode(时段,0 ,订单数量)) as "0", sum(decode(时段,1 ,订单数量)) as "1", sum(decode(时段,2 ,订单数量)) as "2", sum(decode(时段,3 ,订单数量)) as "3", sum(decode(时段,4 ,订单数量)) as "4", sum(decode(时段,5 ,订单数量)) as "5", sum(decode(时段,6 ,订单数量)) as "6", sum(decode(时段,7 ,订单数量)) as "7", sum(decode(时段,8 ,订单数量)) as "8", sum(decode(时段,9 ,订单数量)) as "9", sum(decode(时段,10,订单数量)) as "10", sum(decode(时段,11,订单数量)) as "11", sum(decode(时段,12,订单数量)) as "12", sum(decode(时段,13,订单数量)) as "13", sum(decode(时段,14,订单数量)) as "14", sum(decode(时段,15,订单数量)) as "15", sum(decode(时段,16,订单数量)) as "16", sum(decode(时段,17,订单数量)) as "17", sum(decode(时段,18,订单数量)) as "18", sum(decode(时段,19,订单数量)) as "19", sum(decode(时段,20,订单数量)) as "20", sum(decode(时段,21,订单数量)) as "21", sum(decode(时段,22,订单数量)) as "22", sum(decode(时段,22,订单数量)) as "23" from APEX_ORDER_ANALYSIS_HB_HOUR where 下单日期 =to_date('2021-04-05','yyyy-mm-dd') group by rollup(时段) )where 时段 is null; select "0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23" from( select total, sum("0")as "0", sum("1")as "1", sum("2")as "2", sum("3")as "3", sum("4")as "4",sum("5")as "5",sum("6")as "6", sum("7")as "7", sum("8")as "8", sum("9")as "9", sum("10")as "10", sum("11")as "11",sum("12")as "12", sum("13")as "13", sum("14")as "14",sum("15")as "15",sum("16")as "16",sum("17")as "17",sum("18")as "18", sum("19")as "19",sum("20")as "20",sum("21")as "21",sum("22")as "22",sum("23")as "23" from( select 1 as total,时段, sum(decode(时段,0 ,订单数量)) as "0", sum(decode(时段,1 ,订单数量)) as "1", sum(decode(时段,2 ,订单数量)) as "2", sum(decode(时段,3 ,订单数量)) as "3", sum(decode(时段,4 ,订单数量)) as "4", sum(decode(时段,5 ,订单数量)) as "5", sum(decode(时段,6 ,订单数量)) as "6", sum(decode(时段,7 ,订单数量)) as "7", sum(decode(时段,8 ,订单数量)) as "8", sum(decode(时段,9 ,订单数量)) as "9", sum(decode(时段,10,订单数量)) as "10", sum(decode(时段,11,订单数量)) as "11", sum(decode(时段,12,订单数量)) as "12", sum(decode(时段,13,订单数量)) as "13", sum(decode(时段,14,订单数量)) as "14", sum(decode(时段,15,订单数量)) as "15", sum(decode(时段,16,订单数量)) as "16", sum(decode(时段,17,订单数量)) as "17", sum(decode(时段,18,订单数量)) as "18", sum(decode(时段,19,订单数量)) as "19", sum(decode(时段,20,订单数量)) as "20", sum(decode(时段,21,订单数量)) as "21", sum(decode(时段,22,订单数量)) as "22", sum(decode(时段,22,订单数量)) as "23" from APEX_ORDER_ANALYSIS_HB_HOUR where 下单日期 =to_date('2021-04-05','yyyy-mm-dd') group by 时段 )group by total);8、unpivot可通过unnest实现--Oracle select * from ( select 商品销售额, 预收运费金额, 运费优惠券抵扣金额, 商品销售额+预收运费金额-运费优惠券抵扣金额 应收金额, 微信支付金额, 支付宝支付金额, 余额支付金额, 其他支付金额,一手币支付金额 from ( select round(sum(商品销售额),2) as 商品销售额 ,round(sum(case when 支付方式 != 9 and 是否包邮 = 0 then 预收运费金额 else 0 end)-sum(部分退款补扣运费),2) as 预收运费金额 ,round(sum(运费优惠券抵扣金额),2) as 运费优惠券抵扣金额 ,round(sum(微信支付金额),2) as 微信支付金额 ,round(sum(支付宝支付金额),2) as 支付宝支付金额 ,round(sum(余额支付金额),2) as 余额支付金额 ,round(sum(其他支付金额)-sum(case when 支付方式 = 9 and 是否包邮 = 0 then 预收运费金额 else 0 end),2) as 其他支付金额 ,round(sum(一手币支付金额),2) 一手币支付金额 from APEX_CW_SALE_ORDER_W@SLAVE12C_6 where 订单日期 between to_date('2021-04-05','yyyy-mm-dd') and to_date('2021-04-08,'yyyy-mm-dd') ) a ) a unpivot (指标名称 for 指标值 in (商品销售额, 预收运费金额, 运费优惠券抵扣金额, 应收金额, 微信支付金额, 支付宝支付金额, 余额支付金额, 其他支付金额,一手币支付金额)) ; --DWS select unnest(ARRAY['商品销售额', '预收运费金额', '运费优惠券抵扣金额','应收金额','微信支付金额','支付宝支付金额','余额支付金额','其他支付金额','一手币支付金额']) AS 指标名称, unnest(ARRAY[商品销售额,预收运费金额,运费优惠券抵扣金额,应收金额,微信支付金额,支付宝支付金额,余额支付金额,其他支付金额,一手币支付金额]) AS 指标值 from( select 商品销售额, 预收运费金额, 运费优惠券抵扣金额, 商品销售额+预收运费金额-运费优惠券抵扣金额 应收金额, 微信支付金额, 支付宝支付金额, 余额支付金额, 其他支付金额,一手币支付金额 from ( select round(sum(商品销售额),2) as 商品销售额 ,round(sum(case when 支付方式 != 9 and 是否包邮 = 0 then 预收运费金额 else 0 end)-sum(部分退款补扣运费),2) as 预收运费金额 ,round(sum(运费优惠券抵扣金额),2) as 运费优惠券抵扣金额 ,round(sum(微信支付金额),2) as 微信支付金额 ,round(sum(支付宝支付金额),2) as 支付宝支付金额 ,round(sum(余额支付金额),2) as 余额支付金额 ,round(sum(其他支付金额)-sum(case when 支付方式 = 9 and 是否包邮 = 0 then 预收运费金额 else 0 end),2) as 其他支付金额 ,round(sum(一手币支付金额),2) 一手币支付金额 from APEX_CW_SALE_ORDER_W where 订单日期 between to_date('2021-04-05','yyyy-mm-dd') and to_date('2021-04-08','yyyy-mm-dd') ));9、Oracle自增主键可使用function+trigger的形式替代(update:考虑性能影响,DWS建议使用sequence+primary key)-- Oracle create sequence MY_SUPPLY_CG_KEEP_M_SEQ minvalue 1 maxvalue 9999999999999999999999999999 start with 49421 increment by 1 cache 20; CREATE OR REPLACE TRIGGER "MY_SUPPLY_CG_KEEP_M_TRIG" before insert on "SUPPLY_CG_KEEP_M" for each row begin if :new."ID" is null then select "MY_SUPPLY_CG_KEEP_M_SEQ".nextval into :new."ID" from sys.dual; end if; end; / --DWS create sequence MY_SUPPLY_CG_KEEP_M_SEQ --创建序列 minvalue 1 maxvalue 9223372036854775807 --注意Oracle与DWS序列的最大值范围不同,需要修改 start with 2757641 increment by 1 cache 20;--DWS仅支持cache关键字,详见DWS产品文档 CREATE OR REPLACE FUNCTION MY_SUPPLY_CG_KEEP_M_TRIG_FUNC() RETURNS trigger AS $BODY$ --创建函数 BEGIN NEW.ID := nextval('MY_SUPPLY_CG_KEEP_M_SEQ'); RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql'; CREATE TRIGGER MY_SUPPLY_CG_KEEP_M_TRIG --创建触发器 BEFORE INSERT ON SUPPLY_CG_KEEP_M FOR EACH ROW WHEN (NEW.ID IS NULL) EXECUTE PROCEDURE MY_SUPPLY_CG_KEEP_M_TRIG_FUNC(); ALTER SEQUENCE MY_SUPPLY_CG_KEEP_M_SEQ OWNED BY SUPPLY_CG_KEEP_M.ID; --添加关联10、in nvl() 修改为 = nvl()11、Navitcat在执行大结果集语句时性能较差,建议使用Data Studio12、array的初始化在DWS的新老版本上有差异,老版本需要使用valname = array[];的形式进行初始化,新版本可以使用valname=valname();形式进行初始化13、case when表达式不同分支返回的类型可能不一致,转换存储过程后如果类型不一致需要对输出列做类型强转
-
数仓GaussDB(DWS)教程培训汇总,欢迎大家一起交流探索,共同学习~分类主题链接产品文档数仓GaussDB(DWS)产品主页https://www.huaweicloud.com/product/dws.html数仓GaussDB(DWS)帮助文档https://support.huaweicloud.com/dws/index.html数仓GaussDB(DWS)生态地图_工具类https://bbs.huaweicloud.com/forum/thread-103637-1-1.html精品博文【博文汇总】GaussDB(DWS)博文汇总1https://bbs.huaweicloud.com/forum/thread-84739-1-1.html【博文汇总】GaussDB(DWS)博文汇总2https://bbs.huaweicloud.com/forum/thread-113509-1-1.html【8大场景系列】玩转数仓运维,做个不秃头的DBA https://bbs.huaweicloud.com/forum/thread-118222-1-1.html【干货合集】数仓性能调优必读,带你进阶为性能调优高手https://bbs.huaweicloud.com/forum/thread-107669-1-1.html维护宝典这一篇就够了,全方位带你了解集群类问题!!!https://bbs.huaweicloud.com/forum/thread-114402-1-1.html【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1https://bbs.huaweicloud.com/forum/thread-85548-1-1.html【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴2https://bbs.huaweicloud.com/forum/thread-98530-1-1.html项目实践【项目实践汇总】GaussDB(DWS)项目实践汇总贴https://bbs.huaweicloud.com/forum/thread-114093-1-1.html课程培训【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总https://bbs.huaweicloud.com/forum/thread-91944-1-1.html【培训视频汇总】GaussDB(DWS) 培训视频汇总,https://bbs.huaweicloud.com/forum/thread-93315-1-1.html最新活动【最新活动】DWS活动火热进行中,互动好礼送不停https://bbs.huaweicloud.com/forum/thread-113500-1-1.html更多信息数仓GaussDB(DWS)微信公众号,和您分享最新最全的PB级数仓黑科技(扫码添加)数仓GaussDB(DWS)下助手微信,加入专家群聊,大神直聊(扫码加入)【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中) 扫码关注我哦,我在这里↓↓↓
-
【直播主题和时间】 数仓“索引”的正确打开姿势 2021年4月15日20:00-21:00【活动介绍】 本期DevRun开发者沙龙直播活动,我们邀请了华为云数仓GaussDB(DWS)资深存储引擎专家虫虫,携手内核研发工程师小小酥带来数仓“索引“的正确打开姿势,来为大家揭开分布式数仓索引的神秘面纱,实践原理相结合,让您摆脱还停留在只会SQL简单调优处境的尴尬,利用好索引这把武器,结合存储提供的多种调优手段,玩转数仓GaussDB(DWS)!本场直播不仅课程精彩,参与论坛&直播互动、报名观看直播,移动电源、蓝牙音箱、折叠背包、PVC袋多重好礼等你来拿,更有机会抽取价值3500元的DWS免费试用机会哦!!!活动即刻开启,凡在本主题帖中留言、参与直播或论坛互动的用户均可参与抽奖哦~点击观看直播>>https://bbs.huaweicloud.com/live/DevRun_live/202104152000.html,直播互动3轮抽奖等着你,快来围观论坛互动赢好礼>>https://bbs.huaweicloud.com/forum/thread-119517-1-1.html,超多好礼等你来拿,更有机会抽取价值3500元的DWS免费试用机会,不容错过!!!点此报名直播>>点此报名,直播不迷路(直播过程中3轮抽奖,不容错过哦~)【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
微软的powerBI 是否可以直接对接DWS数据库?
-
随着互联网和物联网的快速发展,实时数据分析应用的业务需求量日益增长,例如实时推荐、实时风控、实时监测、精准营销等,数据实时处理能力成为企业提升竞争力的一大因素。华为GaussDB(DWS)实时数仓提供即开即用、可扩展且完全托管的分析型数据仓库服务,支撑高并发高性能实时数据分析。4月8日在华为云TechWave技术峰会上,GaussDB(DWS)技术专家李海丰详谈实时数仓黑科技。 GaussDB(DWS) 实时数据分析技术架构基于企业级内核,采用统一SQL引擎,多引擎协同,实现数据体系内自闭环,从而达到一份数据多个引擎调用,高效多维度分析。依据流数据和时序数据特征打造出从优化器、执行器到存储的全系列、高性能、可扩展的实时数仓,提供四大技术创新:1. CEP引擎告别T+1模式改变传统数据先入库再查询的分析模式,CEP引擎提供流计算能力:数据先计算分析,并实时反馈计算结果,计算结果可以继续进行下一步计算或者保存,大大降低了数据处理时延。2. 1 = N:GaussDB(DWS) 实时数仓= Flink/Spark Streaming + Druid + InfluxDB……国内首创在同一套系统内实现流和时序数据的处理和预聚合操作,减少数据跨系统间迁移,降低冗余存储和加载时间,最大化的利用系统缓存,提高处理效率。3. 预置丰富时序、流处理函数,一切皆SQL 采用最简洁高效的数据开发语言SQL,并预置丰富的时序和流处理函数,通过SQL即可完成复杂流式计算,可实现亿级数据,秒级聚合,极大简化应用开发。4. 高达40:1的压缩比,极大节约存储成本 通过自适应压缩算法,充分利用行列混合存储+时序数据专用压缩算法优势,实现低时延查询和高效存储。 技术专家李海丰还分享了实时智能监控平台的实践,传统数据仓库单节点入口性能和散列度存在瓶颈,GaussDB(DWS)实时数仓单节点入库性能超过10w/s,支持千万级散列度计算,彻底解决时序数据和流数据“装不进”和“算不动”的问题。 目前GaussDB(DWS)实时数仓已经正式发布公测。华为云GaussDB(DWS)实时数仓仍将不断迭代优化,为企业用户提供更强大的实时数据分析能力。【推荐阅读】【最新活动汇总】DWS活动火热进行中,超多互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
招商银行定位为“金融科技银行”,作为银行业数字化转型的代表和先行者,在持续金融创新之路上坚定不移的探索前行。招行数据仓库架构师曾民在华为云TechWave全球技术峰会上分享了招商银行云化数仓探索之路早在1998年,招行就开始引入数据仓库的理念,使用SYBASE搭建数据处理平台,成为国内最早一批开展企业级数据仓库建设的银行。2002年基于DB2构建数据仓库平台,再到2013年重构TD仓库。招行基本上建成涵盖客户服务、产品销售、风险管理、绩效管理、监管审计等领域的完整的数据应用平台。2020年招行正式启动数据使能平台建设,并提出了“人人用数,人人都是数据分析师”的数据发展战略,一体机数据仓库使用模式遇到了瓶颈:数据仓库平台存储和算力无法匹配应用数据量高速增长。随着云计算技术的蓬勃发展,云化数据仓库可通过计算存储和网络的资源池化管理,按需弹性部署;云分布式架构以其灵活和高可用优势,成为招商银行数据使能平台首选架构。面向未来,新一代数据仓库平台是怎么样的?在不断思考中,招商银行开启了新一代云数据仓库的选型。 打破重建无疑是极其痛苦的。新一代云数据仓库的考察包括数据平台的数据处理能力、性能、高可用性、扩展性、易用性、通用性、自主可控性等维度。基准测试基于TPC-DS 1000X标准测试套件,包括4大项、11个子任务;场景测试基于“分行手机银行行为分析”业务,包括6960个数据库对象,2470个批处理脚本,数据量超过30TB。随后,数据研发部启动了更严苛运维测试,毕竟数据平台除了性能指标以外,更重要的是要能稳定运行。结合招行实际运维需要,数据中心从安全功能、性能容量、管理功能、部署能力、维护能力、拓展能力这六个维度设计了若干测试用例,涉及7大项,98个子任务。测试评估结果,华为云数仓GaussDB(DWS)完全满足招行标准。 华为云数仓GaussDB(DWS) “大”、“快”、“稳”的技术特征符合招商银行对核心数仓的能力要求。尤其是“大”:基于MPP的全对称分布式架构,横向可扩展至2048节点大集群,支持EB级数据量,突破传统数仓扩展的天花板! 招商银行2020年4月正式启动原数据仓库平台向华为云GaussDB(DWS)迁移项目。招行信息技术部、数据中心、架构办等多方部门通力合作,华为数据仓库研发专家、云技术专家以及资深服务技术团队全程鼎力支持,联合成立数仓迁移实施团队,为招行核心数仓平台迁移保驾护航。2020年7月完成基础设施部署并开始应用迁移;2021年1月完成首批11个零售应用切换,并全部完成投产,所有应用均平稳运行,原数仓平台相关应用已关停。 基于华为云GaussDB(DWS)构筑全新一代云上数仓,招商银行实现对零售客户体验的实时监测和数字化呈现,更大的算力支撑使得跑批作业速度较之前得到大幅提升,数据分析师们得以更快更深更广地挖掘客户体验数据价值,全面升级零售客户业务体验。 招行云化数仓的探索还在继续,2021年6月预计完成一半应用迁移,2022年6月预计完成全部应用迁移和投产。华为云数仓GaussDB(DWS)也将会继续助力招商银行的数字化转型之路,未来可期。【推荐阅读】【最新活动汇总】DWS活动火热进行中,超多互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
一、 背景概述 客户要求获取数据库表数据操纵的实时日志信息,包括对数据表的增删改操作,并且保留SQL语句中的参数值,对于该需求我们考虑了以下两个方案,一个使用逻辑解码,通过反解xlog的方式生成逻辑日志;另一种方案通过参数调整系统日志记录内容,使其记录表数据操作信息,再将这客户所需部分信息提取出来另行保存。因逻辑解码属于poc特性,不建议现网使用,选择满足客户需求且风险更小的系统日志提取方案。二、 系统日志概述 集群运行时CN、DN、GTM、CM以及集群安装部署时产生的日志统称为系统日志。如果集群在运行时发生故障,可以通过这些系统日志即使定位故障发生的原因,根据日志内容指定恢复集群的方法。用户可以根据自己的需要,通过修改实例数据目录下的postgresl.conf文件中特定的参数来控制日志的输出,从而更好的了解数据库的运行状态。CN、DN日志每一行内容默认格式: 日期+时间+时区+用户名称+数据库名称+会话ID+日志级别+日志内容log_statement参数说明: log_statement参数配置日志中记录哪些SQL语句,默认值为none,不记录任何SQL语句,配置为ddl记录数据定义语句,mod记录数据定义语句和数据操作语句,all记录所有语句,针对需求我们需要将此参数设置为all。三、 实施方案1. 修改log_statement参数使日志中记录所有语句gs_guc reload -Z coordinator -N all -I all -c “log_statement=all”2. 提取表更新信息使用grep过滤日志中数据操纵语句,参考命令如下cat postgresql.log | grep -v postgres | grep -E -i ": insert|: update|: delete" | grep -v -i ": select " | grep -v '\$' cat postgresql.log | grep -v postgres | grep -E -i -A 1 ": insert|: update|: delete" | grep '\$' | grep -v -i ": select "3. 自动化读取脚本编写策略 CN日志文件到达指定大小会重新生成新的文件,当一份CN日志生成时,从日志文件中获取表数据操作信息,并写入到指定文件中,进行转存处理。因系统日志文件名中包含时间信息,可以根据系统获取的时间获取对应时间的文件列表,日志文件命名规则postgresql-%Y-%m-%d_%H%M%S.log#获取当前时间精确到小时(2小时),和日志文件名同格式date=`date "+%Y-%m-%d_%H"` date1=`date -d "1 hour ago" "+%Y-%m-%d_%H"`使用两个参数获取当前两小时内的文件列表fileList=`ls /var/log/Bigdata/mpp/omm/pg_log/cn_*| grep -E "$date|$date1"`将文件列表转存为数组,当文件列表更新时,说明上一份日志已经打印完成,使用cat从文件列表的倒数第二份文件中读取日志信息。cat /var/log/Bigdata/mpp/omm/pg_log/cn_*/${arrylist[$fileNums-2]} | grep -v postgres | grep -E -i ": insert|: update|: delete" | grep -v -i ": select " | grep -v '\$' > /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log cat /var/log/Bigdata/mpp/omm/pg_log/cn_*/${arrylist[$fileNums-2]} | grep -v postgres | grep -E -i -A 1 ": insert|: update|: delete" | grep '\$' | grep -v -i ": select " >> /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log完整实现脚本如下#log_extraction.sh #!/bin/bash #get all filename in specified path source /opt/huawei/Bigdata/mppdb/.mppdbgs_profile #获取当前时间精确到小时(2小时),和日志文件名相同 date_tmp=`date "+%Y-%m-%d_%H"` date1_tmp=`date -d "1 hour ago" "+%Y-%m-%d_%H"` #获取当前两小时文件数量 countNums=`ls /var/log/Bigdata/mpp/omm/pg_log/cn_* | grep -E "$date_tmp|$date1_tmp" |wc -l` while true do date=`date "+%Y-%m-%d_%H"` date1=`date -d "1 hour ago" "+%Y-%m-%d_%H"` #读取两小时文件列表 fileList=`ls /var/log/Bigdata/mpp/omm/pg_log/cn_*| grep -E "$date|$date1"` fileNums=`ls /var/log/Bigdata/mpp/omm/pg_log/cn_* | grep -E "$date|$date1" |wc -l` #当文件数新增1时 if [ $((10#$fileNums)) -eq $((10#$countNums+1)) ] then #将文件列表转存为数组 set i=0 for file in $fileList do arrylist[i]=$file i=$[$i+1] done #根据过滤条件提取刚生成的日志文件 cat /var/log/Bigdata/mpp/omm/pg_log/cn_*/${arrylist[$fileNums-2]} | grep -v postgres | grep -E -i ": insert|: update|: delete" | grep -v -i ": select " | grep -v '\$' > /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log cat /var/log/Bigdata/mpp/omm/pg_log/cn_*/${arrylist[$fileNums-2]} | grep -v postgres | grep -E -i -A 1 ": insert|: update|: delete" | grep '\$' | grep -v -i ": select " >> /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log #将文件按时间排序 sort -k2nr /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log > /srv/BigData/mppdb/data1/log/recored_${arrylist[$fileNums-2]} rm /srv/BigData/mppdb/data1/log/${arrylist[$fileNums-2]}.log fi #更新外部参数 countNums=$fileNums sleep 10 done
-
众所周知,智能时代的来临正是因为开发者们用一行行代码铸就了千行百业向上、向前的阶梯。他们大到从2G至5G的突破,小到每个技术的由点到面的攻克,每个技术点的突破都会成为行业里最新的利器,比如在数据库领域,DBA们苦Cassandra“数据不一致”久矣: “一致性级别设为local quorum,查询某个分区键的条数,每次查询,条数都不一样。” “按这个分区键的token修复,直接瞬间修复结束。但是再查,还是每次查询条数不一致。” “之前遇到墓碑丢失的问题,单个token查询结果不一致,修复也解决不了”…..如今,强一致的华为云数据库GaussDB(for Cassandra)来了,DBA和开发者们再也不用加班修复数据了。 GaussDB(for Cassandra)是一款基于华为自主研发的存算分离架构的分布式云数据库。它是一个强一致性系统,架构基于华为内部强大且广泛使用的自研分布式存储系统DFV,充分发挥了云开源的弹性伸缩、资源共享的优势,它高度兼容Cassandra协议,拥有超强写入性能,同时具有分钟级节点扩容、数据强一致等优势,性能更强,数据更可靠,扩容更敏捷。整体性能是开源自建2~3倍。开源Cassandra为何不能实现数据强一致? 众所周知,开源Cassandra使用CAP模型中的 AP 放弃了强一致是个既定事实。拿开源Cassandra一致性读场景来说,假如你在图书馆的某一排书架上想借阅一本书,假设书架上书本只有新旧之分,本来你想借阅新入馆的书本,但规则是就近取书,这意味着你拿到的可能不是最新的书本;如果读一致性要求为QUORUM(即读取任一数据中心中quorum数量的节点的结果,返回合并后timestamp最新的结果),则内核会自动触发读修复,然后返回给客户端,也就是图书管理员帮你对比新旧之后取到了最新的书本,假如此时有副本所在节点出现坏盘,且在一定的周期内没有完成数据修复,那么在业务查询时,查到的数据会不准确。GaussDB(for Cassandra)如何实现数据强一致? GaussDB(for Cassandra)则采用存算分离架构来攻克数据不一致的难关,数据的副本一致性由DFV存储平台来保证,对计算节点来说数据单副本、数据强一致,查询命令下发后,协调节点直接从数据节点取数据即可完成。另外支持N-1个节点故障容忍,在系统故障重构或备份恢复时,GaussDB(for Cassandra)能提供10倍于开源Cassandra的性能。GaussDB(for Cassandra)有哪些使用价值?1、在工业制造&气象业,支持PB级数据量,实时精准预测天气 随着科技进步,采集的气象数据指数增长,GaussDB(for Cassandra)可以应对降雨量、湿度、温度等PB级的数据量,支持高并发写入读取;还可以为气象算法、天气预报做到实时在线精准分析;进行离线数据分析时,可以实现分析时长缩短60%。2、在互联网领域,支持用户画像、推荐系统,打造更好的用户体验平台 GaussDB(for Cassandra)具备高并发写入性能和高可扩展性,可保障业务的高可用和稳定性。例如:存放用户画像数据场景,可完美解决数据量大、数据结构Scheme频繁变更等场景;推荐系统中,可分析用户最近的浏览数据,然后推荐相关资源。3、支持实时数据分析、离线分析,离线分析时长缩短60%,效率大幅提升 GaussDB(for Cassandra)提供Stream功能,能对数据的变更做实时在线分析,还可以实现秒级的实时响应,这都是开源Cassandra所不具备的能力。比如某店铺有新用户注册了会员,系统自动向该会员推送商品优惠活动。此外,由于离线分析时长缩短60%,也为商家争取了更多的决策时间。Stream功能支撑实时分析原理图 华为云GaussDB(for Cassandra)正是依托于存算分离架构,才保证了查询准确率、规避了数据不一致修复数据造成的人力成本,才使得GaussDB(for Cassandra)在制造业、物流、医疗保健、房地产、能源生产、农业等领域非常受欢迎,因此,DBA们无需忧心数据修复、数据丢失等问题只需探索专业领域里的星辰大海。 作为华为ICT基础设施业务面向全球开发者的年度盛会,华为开发者大会2021(Cloud)将于2021年4月24日-26日在深圳举行。本届大会以#每一个开发者都了不起#为主题,将汇聚业界大咖、华为科学家、顶级技术专家、天才少年和众多开发者,共同探讨和分享云、计算、人工智能等最新ICT技术在行业的深度创新和应用。智能时代,每一个开发者都在创造一往无前的奔腾时代。世界有你,了不起!
-
问题现象:用户在创建、扩容、删除dws集群时,在事件管理的菜单目录上查询不到操作的事件记录排查思路:1.检查serviceCM =》consoleframework服务配置 =》silvan配置信息 =》region关联service 里面有没有配置当前局点的eventservice服务,并且检查lb地址以及端口是否为31417。consoleframework服务配置2.登录部署dws服务的cdk集群的master节点机器,执行 curl -kv lb域名:31417 检查网络防火墙端口是否畅通,若curl不通则需要打通cdk到lvs 31417的防火墙端口。3.检查serviceCM =》consoleframework服务配置 =》stage配置信息 =》服务配置 里面搜索dws服务,点击进入后检查url mapping里面透传文件中的targetService是否为eventservice。4.如若前三点都排查过正常,则需要登录event容器中查看event日志文件报错信息,再定位原因。
-
【功能模块】【操作步骤&问题现象】发现有数据倾斜后,想通过数据目录查找到倾斜比较大的表,如果是分区表,在数据目录下,每个分区对应一个文件,并且文件名不一样,这种如何汇总统计一个分区表的总大小?【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
据预测未来4年数据量将激增5-8倍,达180ZB,到35年呈50倍增长。同时,数据作为继土地、资本、技术、劳动力的第5种生产要素,已是数字经济发展的重要要素。但相关调查结果显示,企业运营中仅56%的数据被存储,仅32%的数据被利用。因此,在政企数字化转型的关键阶段,如何利用数据湖、数据仓库、数据库等技术,加速数据资产化,发挥数据新价值,成为当前数据领域的重要话题。4月8日,华为云TechWave全球技术峰会在深圳成功举办,峰会以“创新·普惠”为主题,汇聚业界精英、技术大咖、先锋企业、合作伙伴等,共话前沿技术,分享行业优秀应用实践,探讨企业智能升级的成长之道。其中,数据使能分论坛围绕“数据使能,驱动业务增长”为主题,首先解读华为云数据使能服务DAYU,同时招商银行、深圳地铁将分享数字化转型创新实践,合作伙伴永洪BI畅谈联合解决方案,最后由华为云FusionInsight MRS云原生数据湖、GaussDB数据库、GaussDB(DWS)数据仓库等技术专家共同探讨政企用数之道。(数据使能分论坛现场照片)华为云数据使能DAYU重磅开场:加速数据资产化,开发数据新价值(华为云数据使能服务总经理马麟瑜演讲)华为云数据使能服务总经理马麟瑜表示,“数据管理的领导者正在通过挖掘数据价值来驱动数字化转型,创造发展机会,改善客户体验和重塑行业格局。华为云数据使能DAYU致力于打通企业数据从资源到资产的通路,助力政企客户跨越孤立系统、感知业务的数据资源智能管理解决方案,实现全域数据入湖,帮助政企客户从多角度、多层次、多粒度挖掘数据价值,实现数据驱动的数字化转型。”华为云数据使能服务DAYU包含三层能力:数据技术平台-智能数据湖 FusionInsight:为政企客户提供覆盖海量数据全生命周期的管理方案。包含MRS云原生数据湖、GaussDB数据库、GaussDB(DWS)数据仓库、数据湖治理中心DGC等服务。使能套件 DAYU Ekit:包含使能在线化工作台,资产化效率提升10X; 行业使能知识库,协同伙伴沉淀行业资产模型,同时将AI驱动方法论与行业知识结合,实现数据资产化智能流水线工作。资产中心 DAYU Hub:通过为客户提供丰富的数据模型、数据资产管理方法,帮助企业实现资产可信管理,资产模型智能分析 ,多方安全可信计算,保障全局数据的安全流通。招商银行、深圳地铁分享大数据创新实践数据使能分论坛中,招商银行、深圳地铁分别分享了基于华为云数据域的行业创新实践。(招商银行数据仓库架构师曾民演讲)招商银行数据仓库架构师曾民表示:招商银行通过使用华为云强化了数据平台的建设,“人人用数”战略让招行没有难用的数据,打造金融数仓,秉承“源于业务,高于业务,先于业务”的理念,以解决实际业务问题为出发点,沉淀可复用易扩展的数据使能能力,成为数据“能用,好用,爱用”的践行者与布道者。早在2019年下半年,招商银行就开始了新一代MPP数据仓库平台的选型,旨在通过对数据平台的数据处理能力、性能、高可用性、扩展性、易用性、通用性等特性进行多方位的考察。通过多维度的测试,最终选定华为云GaussDB(DWS)作为新一代云上数据仓库平台,进一步提升了金融数仓的算力、备份、存储等性能,加速落实招行“人人用数,人人都是数据分析师”的数据发展战略!同时招商银行已和华为云FusionInsight MRS展开了一系列金融数据湖联合创新,旨在使用HetuEngine提高用数效率,简化用数方式。(深圳地铁运营集团线网管控中心副总经理张洪庆演讲)深圳地铁运营集团线网管控中心副总经理张洪庆在“云数赋能,实现智慧深铁“议题中表示:“在智慧城轨快速发展的大背景下,深圳地铁以科技赋能运营为目标,积极探索智慧运维新模式。在智慧城轨探索上,试点先行,顶层规划和企业标准同步推进,采用了华为城轨云解决方案,利用云计算、大数据、5G、人工智能等技术核心,建立了统一、开放、智能的城轨数字平台。在城轨云平台基础上,利用华为云 FusionInsight MRS云原生数据湖能力构建深圳地铁大数据分析平台,在智慧车站、智慧运维方面,对新技术与地铁场景进行创新融合,推进了车站业务全日自动运行、线上线下一体化客服、设备主动检测、健康管理等应用,探索数字化、高效化的新业务模式,科技赋能运营更高质量运行,企业更低成本运作,为城市提供更优质的公共交通服务。”(永洪BI技术专家黄华晃演讲)合作伙伴永洪BI分享基于华为云实现敏捷BI的联合解决方案永洪BI技术专家黄华晃分享了“永洪BI自助用数,敏捷提效20倍“议题,并表示基于华为云FusionInsight MRS云原生数据湖,永洪BI实现快速搭建应用,打造了更敏捷、更快速、更强大的“永洪BI”,具备自服务、高性能、极致易用等特点,已广泛用于金融、政务、能源等行业,让人人都成为数据分析师!至今,华为云FusionInsight联合800+ISV,已为千行百业的客户提供“一企一湖、一城一湖“的数字化转型方案。数字化转型之路离不开客户对于华为云FusionInsight智能数据湖的信赖,也离不开伙伴的精诚合作。同时,华为云也坚持技术创新,在MRS云原生数据湖、GaussDB数据库、GaussDB(DWS)数据仓库等产品上不断潜心钻研,勇攀技术高峰!华为云FusionInsight、GaussDB技术专家共谈数字化转型创新技术华为云FusionInsight解决方案首席架构师徐礼锋在会议中分享了“华为云FusionInsight MRS云原生数据湖一架构三湖,持续演进“的议题,深度解读了一个架构实现三种湖的能力和新技术。(华为云FusionInsight解决方案首席架构师徐礼锋演讲)逻辑数据湖:HetuEngine提供跨湖、跨仓、跨云统一访问,减少数据搬迁,数据高效流动,全域数据秒级协同分析秒级响应,业务上线效率提升10倍,由周级缩短至天级。实时数据湖:流处理 + Hudi实现数据更新入湖,从T+1到T+0; ClickHouse提供毫秒级实时OLAP分析能力;Flink提供FlinkSQL能力,批流SQL接口统一,实现流批一体。离线数据湖:HetuEngine提供秒级交互式查询能力,数据不出湖,分析链路短,性能比Impala快30%+,分析提效10倍+;DLC提供统一的元数据,数据全局可视; HetuEngine提供湖内统一SQL接口:HDFS、Hive、HBase、ES等,简化用数。华为云FusionInsight MRS践行产学研合作,全面推进大数据开源技术发展,联合清华大学发布了IoTDB时序引擎版本。目前华为云FusionInsight MRS已应用于60多个国家3000+客户,助力政企客户实现一企一湖、一城一湖,业务洞见更准,价值兑现更快!华为云GaussDB技术专家胡彦军分享了“华为云云原生分布式数据库GaussDB,多模架构,多元生态“的议题,为我们解读了华为倾力打造的云原生数据库GaussDB系列产品的技术创新与行业普惠。(华为云GaussDB技术专家胡彦军演讲)华为云GaussDB(for openGauss)基于云化的部署模式,分布式形态,生态开放,更好满足了企业的数据库诉求。经过13年的积累,从内部锤炼,再到外部行业实践,华为云GaussDB(for openGauss)淬炼出6大核心能力:(1)超高可用:支持跨机房、同城、异地、多活高可用,支持分布式强一致,数据0丢失。(2)开放生态:openGauss开放生态,确保客户避免被类似传统商业数据库的封闭生态锁定。(3)极致扩展:通过分布式全局事务一致性优化,实现计算与存储的垂直扩展能力,同时支持新增分片的数据在线重分布能力。(4)卓越性能:分布式优化器+Numa-aware技术加持,提供极致性能。在TPC-C、TPC-H等企业级负载下性能表现卓越。以及具备丰富的企业级特性(如支持HTAP混合负载,拥有AI自治能力)和超高的安全性(具备独立的代码级的问题修复能力及架构优化能力),构建了极具竞争力的能力。华为云GaussDB(DWS)技术专家李海丰分享了“华为云GaussDB(DWS)实时数仓,提速全场景数据分析“的议题,其中实时数仓的时序引擎和CEP引擎成为亮点。(华为云GaussDB(DWS)技术专家李海丰演讲)华为云GaussDB(DWS) 是一款具备分析及混合负载能力的分布式数据仓库,支持行存储与列存储,提供PB级数据分析能力、多模分析能力和实时处理能力,用于数据仓库、数据集市、实时分析、实时决策和混合负载等场景,广泛应用于汽车、制造、零售、互联网、金融、政府、电信等行业核心分析决策系统。作为新一代全场景云原生数据仓库,它不仅仅是把数仓搬上云这么简单,而是真正面向未来的云原生架构的数仓服务。传统数仓一般是基于分布式shared nothing的MPP架构实现的,而GaussDB(DWS)在MPP架构的基础上,与高性能的云存储相结合,打造了多温存储的存算分离架构,支持资源的弹性伸缩。同时,逻辑集群和多租户技术,将存储和计算资源进行了更细粒度的隔离,用户可以对不同的业务划分不同的逻辑集群或租户,实现更加灵活的弹性。受益于云服务的多样性,GaussDB(DWS)支持多源、多模的融合分析,既可以在库内支持时序、流、全文检索、GIS等内置多引擎的数据分析,又可以基于OBS实现跨引擎的协同计算,例如与FusionInsight MRS云原生数据湖、GES图引擎、ModelArts AI平台等实现数据免搬迁。至此,华为云TechWave全球技术峰会数据使能分论坛圆满结束。围绕“数据使能,驱动业务增长”主题,为现场观众讲述了金融、交通等行业的数字化转型创新实践,联合合作伙伴畅谈数据湖BI联合解决方案,云集华为云DAYU数据使能、FusionInsight MRS云原生数据湖、GaussDB数据库、GaussDB(DWS)数据仓库等技术专家共聚一堂“鹏城论数”,探讨政企用数之道,分享了政企客户数字化前沿技术。下一场,上海,与您不见不散!调查问卷更多内容,华为云FusionInsight系列文章:https://bbs.huaweicloud.com/forum/thread-66105-1-1.html
-
【摘要】 本文介绍GaussDB(DWS)和Teradata数据库分区表的实现原理和使用方法。第一章:GaussDB(DWS)分区介绍一、 分区与分区表:1. 分区表及分区概念:分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的,即是由普通表存储的,主要用于提升查询性能。常见的分区方案有范围分区(Range Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)、数值分区(Value Partition)等。目前行存表、列存表仅支持范围分区。范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。范围分区的分区策略是指记录插入分区的方式。目前范围分区仅支持范围分区策略。范围分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已 创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是常用的分区策略。范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。 2. GaussDB(DWS)分区表:GaussDB(DWS)数据库支持的分区表为范围分区表。通过分区表的剪枝机制可以大幅减少数据的扫描量。有限地支持唯一约束和主键约束,即唯一约束和主键约束的约束键必须包含所有分区键。分区表上不支持并行创建索引、不支持创建部分索引、不支持NULL FIRST特性。在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。在数据写入分区表时,GaussDB(DWS)还提供了Exchange(交换分区)的技术来提升写入性能。 3. 分区及使用分区表的好处:分区可以提供若干好处:l 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单 独分区或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。l 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是访问整个表可 以获得巨大的性能提升。l 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删 除那个分区以获得巨大的性能提升,同时还可以避免由于大量DELETE导致的 VACUUM超载(仅范围分区)。 分区表和普通表相比具有以下优点:l 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。l 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。l 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。l 均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。 二、 GaussDB(DWS)分区:1. GaussDB(DWS)分区表的技术指标:l 创建列存分区表和HDFS分区表的数量建议不超过1000个。l 分区表的分区个数最大值为32768l 分区表的单个分区大小最大值为1PBl 分区表的单个分区记录数最大值为255 2. 分区建议当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:l 【建议】使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。l 【建议】分区名称应当体现分区的数据特征。例如,关键字+区间特征。l 【建议】将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢 出。普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。 3. 分区使用说明3.1 创建表空间CREATE TABLESPACEØ 只有系统管理员可以创建表空间。Ø 不允许在一个事务块内部执行CREATE TABLESPACE。Ø 执行CREATE TABLESPACE失败,如果内部创建目录(文件)操作成功了就会产生残留的目录(文件),重新创建时需要用户手动清理表空间指定的目录下残留的 内容。如果在创建过程中涉及到数据目录下的表空间软连接残留,需要先将软连 接的残留文件删除,再重新执行OM相关操作。Ø CREATE TABLESPACE不支持两阶段事务,如果部分节点执行失败,不支持回滚。语法:CREATE TABLESPACE tablespace_name [ OWNER user_name ] RELATIVE LOCATION 'directory' [ MAXSIZE 'space_size' ] [with_option_clause];其中普通表空间的with_option_clause为: WITH ( {filesystem= { 'general'| "general" | general} | random_page_cost = { 'value' | value } | seq_page_cost = { 'value' | value }}[,...])其中HDFS表空间的with_option_clause为: WITH ( filesystem= { 'systemtype '| "systemtype" | systemtype } [ { , address = 'ip:port [ {, ip:port }]' ], cfgpath = 'path' , storepath = 'rootpath' [{, random_page_cost = { 'value'| value }}] [{,seq_page_cost = { 'value'| value }}]) 3.2 创建分区表 CREATE TABLE PARTITION 语法:CREATE TABLE [ IF NOT EXISTS ] partition_table_name ( [ { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] }[, ... ] ] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | { [ HASH ] ( column_name ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] PARTITION BY { {VALUES (partition_key)} | {RANGE (partition_key) ( partition_less_than_item [, ... ] )} | {RANGE (partition_key) ( partition_start_end_item [, ... ] )} } [ { ENABLE | DISABLE } ROW MOVEMENT ];列约束column_constraint:[ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | UNIQUE index_parameters | PRIMARY KEY index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]表约束table_constraint:[ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters} [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]like选项like_option:{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL }索引存储参数index_parameters:[ WITH ( {storage_parameter = value} [, ... ] ) ] [USING INDEX TABLESPACE tablespace_name ]partition_less_than_item:PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) [TABLESPACE tablespace_name]partition_start_end_item:PARTITION partition_name { {START(partition_value) END (partition_value) EVERY (interval_value)} | {START(partition_value) END ({partition_value | MAXVALUE})} | {START(partition_value)} | {END({partition_value | MAXVALUE})} } [TABLESPACE tablespace_name]在创建分区表若第一个分区定义含START值,则范围(MINVALUE,START) 将自动作为实际的第一个分区。在创建分区表时START END与LESS THAN语法不可混合使用。即使创建分区表时使用START END语法,备份(gs_dump)出的SQL语句也是 VALUES LESS THAN语法格式。3.3 修改表分区 ALTER TABLE PARTITION修改表分区,包括增删分区、切割分区、合成分区,以及修改分区属性等。注意事项Ø 添加分区的表空间不能是PG_GLOBAL。Ø 添加分区的名字不能与该分区表已有分区的名字相同。Ø 添加分区的分区键值要和分区表的分区键的类型一致,且要大于分区表中后一个范围分区的上边界。Ø 如果目标分区表中已有分区数达到了大值(32767),则不能继续添加分区。Ø 当分区表只有一个分区时,不能删除该分区。Ø 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列 个数相同,并且一一对应。Ø Value分区表不支持相应的Alter Partition操作。Ø 列存分区表不支持切割分区。Ø 不能修改分区表的tablespace,但可以修改分区的tablespace。 ● 修改表分区主语法:ALTER TABLE [ IF EXISTS ] { table_name | ONLY table_name | ONLY ( table_name )} action [, ... ];其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区 的连续性,无论这些子句的排序如何,GaussDB A总会先执行DROP PARTITION再执行ADD PARTITION操作,后顺序执行其它分区维护操作。move_clause | exchange_clause | row_clause | merge_clause | modify_clause | split_clause | add_clause | drop_clause– move_clause子语法用于移动分区到新的表空间。MOVE PARTITION { partion_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename– exchange_clause子语法用于把普通表的数据迁移到指定的分区。EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ]进行交换的普通表和分区必须满足如下条件: ▪ 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。 ▪ 普通表和分区的表压缩信息严格一致。 ▪ 普通表和分区的分布列信息严格一致。 ▪ 普通表和分区的索引个数相同,且对应索引的信息严格一致。 ▪ 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。 ▪ 普通表不可以是临时表。 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。– row_clause子语法用于设置分区表的行迁移开关。{ ENABLE | DISABLE } ROW MOVEMENT– merge_clause子语法用于把多个分区合并成一个分区。MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name [ TABLESPACE tablespacename ]– modify_clause子语法用于设置分区索引是否可用。MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }– split_clause子语法用于把一个分区切割成多个分区。SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause }▪ 指定切割点split_point_clause的语法为: AT ( partition_value ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] )u 列存分区表不支持切割分区。 u 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。▪ 不指定切割点no_split_point_clause的语法为。 INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) }u 不指定切割点的方式,partition_less_than_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的 分区键,partition_less_than_item指定的后一个分区的分区键要等于正在被切割的分区的分区键大小。u 不指定切割点的方式,partition_start_end_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_start_end_item指定的后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区 键。u partition_less_than_item支持的分区键个数多为4,而partition_start_end_item仅支持1个分区键。u 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。▪ 分区项partition_less_than_item的语法为: PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) [ TABLESPACE tablespacename ]▪ 分区项partition_start_end_item的语法为: PARTITION partition_name { {START(partition_value) END (partition_value) EVERY (interval_value)} | {START(partition_value) END ({partition_value | MAXVALUE})} | {START(partition_value)} | {END({partition_value | MAXVALUE})} } [TABLESPACE tablespace_name]– add_clause子语法用于为指定的分区表添加一个或多个分区。 ADD {partition_less_than_item | partition_start_end_item}– drop_clause子语法用于删除分区表中的指定分区。 DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } ● 修改表分区名字的语法:ALTER TABLE [ IF EXISTS ] { table_name| ONLY table_name | ONLY ( table_name )} RENAME PARTITION { partion_name | FOR ( partition_value [, ...] ) } TO partition_new_name; 3.4 查询分区语法: SELECT * FROM [scheme]. table_name PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) };3.5 删除分区表DROP TABLE删除指定的分区表。DROP TABLE会强制删除指定的表,删除表后,依赖该表的索引会被删除,而使用到该表的函数和存储过程将无法执行。删除分区表,会同时删除分区表中的所有分区。删除分区表与删除普通表的语法一致,都是通过DROP TABLE语法进行删除。语法:DROP TABLE [ IF EXISTS ] { [schema.]table_name } [, ...] [ CASCADE | RESTRICT ];3.6 删除表空间DROP TABLESPACEØ 只有表空间所有者有权限执行DROP TABLESPACE命令,系统管理员默认拥有此权限。Ø 在删除一个表空间之前,表空间里面不能有任何数据库对象,否则会报错。Ø DROP TABLESPACE不支持回滚,因此,不能出现在事务块内部。Ø 执行DROP TABLESPACE操作时,如果有另外的会话执行\db查询操作,可能会由于tablespace事务的原因导致查询失败,请重新执行\db查询操作。Ø 如果执行DROP TABLESPACE失败,需要再次执行一次DROP TABLESPACE IF EXISTS。 语法:DROP TABLESPACE [ IF EXISTS ] tablespace_name;第二章:Teradata分区介绍一、 Teradata分区表的设计原理:1.1 创建分区表的时候会在每行记录上加一个分区值Partition #。Ø Row ID = Partition # + Row Hash + Uniqueness ValueØ 在新版本里面会自适应表分区的个数,小于65,535时使用2-byte做分区值,如果大于会用8-byte分区值,最大支持:9.223 E18个分区 1.2 数据存放的三级机制:Ø 通过Row的PI字段的hash值确定放那个AMP上(类比我们的逻辑DN)Ø 在AMP级别,Row会按其分区值排序存放。Ø 在分区内,数据行通过Row-ID序列逻辑存储。 图例:1.3 分区表数据访问机制:二、 Teradata分区表的优缺说明:2.1. 优点:Ø 提升按partition字段查询的效率,避免做全表扫描,节约IO资源。 2.2. 缺点:Ø 每行多申请2-byte空间(8-byte),会需要额外perm空间。Ø PI的访问可能会慢,因为要扫每个partition。Ø PI的join可能会比较慢,以前等值直接join,现在要每个分区都需要做sub-join。Ø 不能定义UPI,因为这样会导致insert-select会非常慢,需要判断每个partition里面的合法性。 三、 Teradata分区表的使用说明3.1. 创建分区表语法:CREATE TABLE …[UNIQUE] PRIMARY INDEX (col1, col2, …)PARTITION BY <partitioning-expression> Ø <partitioning-expression>选项包括:² 范围分区² 条件分区, 模数分区, 和表达式分区.² 分区列不一定是PI中的字段,如果不是的话,那么PI不能加唯一约束。² 分区表达式中包括的列称为“分区列”。² TD提供了RANGE_N和CASE_N两个函数来方便创建常见分区表。 3.2. RANGE_N的使用说明Ø test_expression一个表达式或者字段,数据类型为BYTEINT, SMALLINT, INTEGER, DATE, CHAR, VARCHAR, GRAPHIC or VARGRAPHIC。Ø start_expression*定义范围起始边界的字符串或字符串表达式。start_expression的数据类型必须与test_expression的数据类型相同,或者必须隐式转换为与test_expression相同的数据类型。如果未指定结束边界,则范围由其开始边界定义(并且该开始边界包括在该范围内),直到但不包括下一个范围的开始边界。使用星号(*)作为列表中第一个范围的开始边界,以指示可能的最小值(所有值和NULL均大于指定为星号的起始边界)。 星号与任何数据类型兼容。Ø end_expression*定义范围结束边界的字符串或字符串表达式。end_expression的数据类型必须与test_expression的数据类型相同,或者必须隐式转换为与test_expression相同的数据类型。列表中的最后一个范围必须指定结束边界。 对于所有其他范围,如果没有指定结束边界,则范围由其开始边界定义(并且该开始边界包括在该范围内),直到但不包括下一个范围的开始边界。星号(*)表示列表中最后一个范围的结束边界,以表示可能的最大值(所有值和NULL均小于指定为星号的结束边界)。Ø EACH range_size值大于零的字符或字符表达式。指定一个EACH短语的范围等效于一系列范围,其中系列中的第一个范围从start_expression开始,随后的范围从start_expression +(range_size * n)开始,当start_expression +(range_size * n)小于或等于end_expression,或者小于范围列表中的下一个start_expression时,n从1开始递增1。对于DATE类型,在后续范围内的有效日期的计算使用ADD_MONTHS而不是加号(+)算术运算符。range_size的数据类型必须兼容才能添加到test_expression中。Ø Note:如果test_expression的数据类型是字符类型(CHAR,VARCHAR,GRAPHIC或VARGRAPHIC),则无法指定EACH短语。Ø NO RANGE用于处理未映射到任何指定范围的test_expression的范围。Ø OR UNKNOWN与NO RANGE一起使用。NO RANGE或UNKNOWN处理不会映射到任何指定范围的test_expression,或者当RANGE_N未指定BETWEEN * AND *范围时,test_expression评估为NULL。Ø UNKNOWN当RANGE_N未指定范围BETWEEN * AND *时,处理一个求值为NULL的test_expression。 Ø 例如:例1:CREATE TABLE orders(storeid INTEGER NOT NULL,productid INTEGER NOT NULL,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,totalorders INTEGER)PRIMARY INDEX (storeid, productid)PARTITION BY RANGE_N(totalorders BETWEEN *, 100, 1000 AND *,UNKNOWN); 分区号范围1totalorders >1002100<=totalorders<1000 3totalorders >=10004totalorders =NULL,UNKNOWN. 例2: CREATE TABLE orders(storeid INTEGER NOT NULL,productid INTEGER NOT NULL,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,totalorders INTEGER NOT NULL)PRIMARY INDEX (storeid, productid)PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *),RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) ); Level 1 Partition NumberLevel 2 Partition Number范围11totalorders >100 and orderdate<'2005-12-31'2totalorders >100 and orderdate>='2005-12-31'21(100<=totalorders<1000) and orderdate<'2005-12-31'2(100<=totalorders<1000) and orderdate>='2005-12-31'31totalorders >=1000 and orderdate<'2005-12-31'2totalorders >=1000 and orderdate>='2005-12-31' 例3.CREATE TABLE Orders(o_orderkey INTEGER NOT NULL,o_custkey INTEGER,o_orderstatus CHAR(1) CASESPECIFIC,o_totalprice DECIMAL(13,2) NOT NULL,o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,o_orderpriority CHAR(21),o_comment VARCHAR(79))PRIMARY INDEX (o_orderkey)PARTITION BY RANGE_N(o_orderdate BETWEEN DATE '2002-01-01' AND DATE '2008-12-31'EACH INTERVAL '1' MONTH) 分区为:2002-01-01到2008-12-31日期范围内的数据,每个月的数据作为一个分区。 目前在银行数据仓库中,第三种分区方式比较常见。 3.3. CASE_N的使用说明Ø conditional_expression条件表达式,计算结果必须为TRUE,FALSE或UNKNOWN。Ø NO CASE如果所有的conditional_expression计算结果为FALSE,则取值为TRUE。Ø OR UNKNOWN和 NO CASE一起使用.如果列表中的conditional_expression结果为FALSE、或者UNKNOWN,则NO CASE 或者 UNKNOWN结果为TRUE。Ø UNKNOWN如果conditional_expression评估为UNKNOWN且列表中的所有先前条件均评估为TRUE评估为FALSE。 Ø 例如:例1. CREATE TABLE orders(storeid INTEGER NOT NULL,productid INTEGER NOT NULL,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,totalorders INTEGER)PRIMARY INDEX (storeid, productid)PARTITION BY CASE_N(totalorders < 100, totalorders < 1000,NO CASE, UNKNOWN); 分区号范围1totalorders >1002100<=totalorders<1000 3totalorders >=10004totalorders =NULL,UNKNOWN. 例2.CREATE TABLE orders(storeid INTEGER NOT NULL,productid INTEGER NOT NULL,orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,totalorders INTEGER NOT NULL)PRIMARY INDEX (storeid, productid)PARTITION BY (CASE_N(totalorders < 100, totalorders < 1000,NO CASE),CASE_N(orderdate <= '2005-12-31', NO CASE) ); Level 1 Partition NumberLevel 2 Partition Number范围11totalorders >100 and orderdate<'2005-12-31'2totalorders >100 and orderdate>='2005-12-31'21(100<=totalorders<1000) and orderdate<'2005-12-31'2(100<=totalorders<1000) and orderdate>='2005-12-31'31totalorders >=1000 and orderdate<'2005-12-31'2totalorders >=1000 and orderdate>='2005-12-31'
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签