《实用教程(Teradata)PPT优秀课件》由会员分享,可在线阅读,更多相关《实用教程(Teradata)PPT优秀课件(81页珍藏版)》请在金锄头文库上搜索。
1、实用教程(Teradata),陆世潮 2008年9月,问题总结,常见问题分类: 表属性不对: Set / Multiset 问题:INSERT操作慢 主索引(PI)设置不合理 问题1:数据倾斜度大,空间爆满。 问题2:JOIN操作,数据需要重分布。 分区索引(PPI)设置不合理 问题:全表扫描 连接条件过于复杂 问题:系统无法优化执行计划 缺乏统计信息 问题:系统无法找到最优化的执行计划,SQL跑得慢哈!,提纲,Teradata架构 常见问题,及解决方法 Teradata工具实用小技巧 JOIN的实现机制 JOIN的优化,Teradata 体系架构,Teradata and MPP Syste
2、ms,RDBMS ARCH,Logical Example of NPPI versus PPI,提纲,Teradata架构 常见问题,及解决方法 Teradata工具实用小技巧 JOIN的实现机制 JOIN的优化,表属性:Set ,例子:pmart.RPT_NM_GRP_PRE_WARN_MON 内蒙移动集团客户预警指标月报表,假设原有1286449条记录 插入:152853条记录 耗时:15秒,表属性:Set ,例子:pmart.RPT_NM_GRP_PRE_WARN_MON 内蒙移动集团客户预警指标月报表,建议:Teradata中都用 MultiSet,假设原有1286449条记录 插入
3、:152853条记录 耗时:1秒,例子: CREATE MULTISET TABLE tttemp.VT_SUBS_VIOC_QUAN as ( SELECT * FROM tttemp.MID_SUBS_VIOC_QUAN WHERE CAL_MONTH = 200802 AND * )WITH DATA PRIMARY INDEX ( subs_id);,临时表, 默认为: Set 需要指定为: Multiset,字段越多,记录越多 差别越明显,PI(Primary Index 主索引)的选择,PI影响数据的存储与访问,其选择标准: 不同值尽量多的字段(More Unique Values
4、) 使用频繁的字段:包括值访问和连接访问 少更新 PI字段不宜太多 最好是手动指定PI,例子:用户语音业务量中间表 CREATE MULTISET TABLE tttemp.MID_SUBS_VIOC_QUAN ( CAL_Month INTEGER TITLE 统计月份, City_ID CHAR(4) TITLE 地市标识, Channel_ID CHAR(8) TITLE 渠道标识, Subs_id CHAR(12) TITLE 用户标识, 。 ) PRIMARY INDEX ( subs_id);,例子:用户语音业务量临时表 CREATE MULTISET TABLE tttemp.V
5、T_SUBS_VIOC_QUAN as ( SELECT * FROM tttemp.MID_SUBS_VIOC_QUAN WHERE CAL_MONTH = 200802 AND * )WITH DATA PRIMARY INDEX ( subs_id);,Subs_ID: 频繁使用 Unique Value多,如果不指定PI, 系统默认为:Cal_Month,PI(Primary Index 主索引)的选择(cont.),例子:梦网客户活跃客户分析 CREATE MULTISET TABLE PMART.FCT_DATA_MONNET_ACTIVE_MON ( CAL_Month INTE
6、GER TITLE 统计月份, City_ID CHAR(4) TITLE 地市标识, Channel_ID CHAR(8) TITLE 渠道标识, Mont_SVC_Type_Cod CHAR(3) TITLE 梦网业务类型编码, Mont_SVC_CAT_MicroCls_Cod CHAR(3) TITLE 梦网业务分类小类编码, Mont_SVC_CHRG_Type_Cod CHAR(2) TITLE 梦网业务计费类型编码, THR_Brand_Cod CHAR(1) TITLE 三大品牌编码, Mont_Consume_Level_Cod CHAR(2) TITLE 梦网消费层次编码,
7、 Consume_Level_Cod CHAR(2) TITLE 消费层次编码, 。 ) PRIMARY INDEX ( CAL_Month ,City_ID ,Channel_ID ,Mont_SVC_Type_Cod , Mont_SVC_CAT_MicroCls_Cod ,Mont_SVC_CHRG_Type_Cod ,THR_Brand_Cod ,Mont_Consume_Level_Cod ,Consume_Level_Cod ); PI:9字段 2字段: City_ID ,Channel_ID 调整PI后,在右边的SQL中,PI是否起作用?,以下SQL,PI是否起作用?: 1.值访
8、问 Select * From FCT_DATA_MONNET_ACTIVE_MON Where City_ID = 070010 and Channel_ID= 0100 and cal_month = 200707 2.连接访问 Select * From FCT_DATA_MONNET_ACTIVE_MON A LEFT JOIN MID_CHANNEL_INFO_DAILY B ON A. Channel_ID = B. Channel_ID and A. City_ID = b. City_ID LEFT JOIN VW_CDE_REGION_TYPE C ON A. City_ID
9、 = C. City_ID 3、值访问连接访问 Select * From FCT_DATA_MONNET_ACTIVE_MON A , VT_INFO B WHERE A. Channel_ID = B. Channel_ID AND A. City_ID = B. City_ID AND A.CAL_MONTH = 200707 AND A. Consume_Level_Cod=B. Consume_Level_Cod,PPI的使用,PPI(Partition Primary Index,分区索引),把具有相同分区值的数据聚簇存放在一起;类似于SQL Server的聚簇索引(Cluster
10、 Index),Oracle的聚簇表(Cluster Table)。 利用PPI,可以快速插入/访问同一个Partition(分区)的数据。,CREATE MULTISET TABLE qdata.TB_DQC_KPI_CHECK_RESULT ( TX_DATE DATE FORMAT YYYYMMDD TITLE 数据日期 NOT NULL, KPI_CODE INTEGER TITLE 指标代码 NOT NULL, 。 ) PRIMARY INDEX ( KPI_CODE ) PARTITION BY RANGE_N(TX_DATE BETWEEN CAST(20030101) AS D
11、ATE FORMAT YYYYMMDD) AND CAST(20191231) AS DATE FORMAT YYYYMMDD) EACH INTERVAL 1 DAY , NO RANGE OR UNKNOWN );,Select * From TB_DQC_KPI_CHECK_RESULT Where tx_date = 20070701; 或 Where tx_date between 20070701 and 20070731; 或 Where tx_date 20070701; 但 Where tx_date like 200707%; 不起作用,PPI的使用(cont.),Part
12、ition上不要使用表达式,否则Partition不能被正确使用。 T1. tx_date/100=CAST(20070917AS DATE FORMAT YYYYMMDD)/100 Substring(T1. tx_date from 1 for 6) =200709 应该修改为 T1. tx_date=CAST(20070901 AS DATE FORMAT YYYYMMDD),PPI的使用(cont.),脚本:tb_030040270.pl /* 删除当月 */ 2小时 del BASS1.tb_03004 where proc_dt = 200709 ; insert into BAS
13、S1.tb_03004 7小时 。,sel . from pview.vw_evt_cust_so cust where acpt_date=cast(200710|01 as date) cast(200710|01 as date)写法错误,PPI不起作用 日期的正确写法: Cast(20071001 as date format YYYYMMDD),在proc_dt建立PPI,PPI字段从Load_Date 调整为acpt_date,创建可变临时表,它仅存活于同一个Session之内 注意指定可变临时表为multiset(通常也要指定PI) 可变临时表不能带有PPI 例子1: creat
14、e volatile multiset table vt_RETAIN_ANLY_MON as ( select col1,col2, from where group by . )with data PRIMARY INDEX (PI_Cols) ON COMMIT PRESERVE ROWS; 例子2: create volatile multiset table vt_RETAIN_ANLY_MON ( col1 char(2), col2 varchar(12) NOT NULL )PRIMARY INDEX (PI_Cols) ON COMMIT PRESERVE ROWS;,创建可
15、变临时表(cont.),例子3: create volatile multiset table vt_RETAIN_ANLY_MON as ( select col1, cast(adc as varchar(12) col2 from where )with no data PRIMARY INDEX (col1) ON COMMIT PRESERVE ROWS; 例子4: create volatile multiset table vt_net_gsm_nl as pdata.tb_net_gsm_nl with no data ON COMMIT PRESERVE ROWS;,字段co
16、l2将用unicode字符集; 当跟普通字段(latin字符集)join时, 需要进行数据重新分布。不建议,失败: 因为pdata.tb_net_gsm_nl 有PPI 而可变临时表不允许有PPI,固化临时表,固化临时表,就是把查询结果存放到一张物理表。 共下次分析或他人使用 Session断开之后,仍然可以使用。 示例1: CREATE MULTISET TABLE tttemp.TMP_BOSS_VOIC as ( select * from pview.vw_net_gsm_nl ) WITH no DATA PRIMARY INDEX (subs_id) ; INSERT INTO tttemp.TMP_BOSS_VOIC SELECT * FROM pview.vw_net_gsm_nl WHERE *; 示例2: CREATE MULTISET TABLE tttemp.TMP_BOSS_VOIC