版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 t
17、ttemp.TMP_BOSS_VOIC SELECT * FROM pview.vw_net_gsm_nl WHERE *; 示例2: CREATE MULTISET TABLE tttemp.TMP_BOSS_VOIC as ( select * from pview.vw_net_gsm_nl WHERE * ) WITH DATA PRIMARY INDEX (subs_id); 示例3:(复制表,数据备份) CREATE MULTISET TABLE tttemp.TMP_BOSS_VOIC AS pdata.tb_net_gsm_nl WITH DATA ;,数据类型,注意非日期字段
18、与日期字段char ,Statement 1 SELECT * FROMEmp1 WHEREEmp_no = 1234;,Statement 2 SELECT * FROMEmp1 WHEREEmp_no = 1234;,Table 1 CREATE TABLE Emp2 (Emp_noINTEGER, Emp_nameCHAR(20) PRIMARY INDEX (Emp_no);,Statement 1 SELECT * FROMEmp2 WHEREEmp_no = 1234;,Statement 2 SELECT * FROMEmp2 WHEREEmp_no = 1234;,Case 2
19、,Results in Full Table Scan,Results in unnecessary conversion,目标列的选择,减少目标列,可以少消耗SPOOL空间,从而提高SQL的效率 当系统任务繁忙,系统内存少的时候,效果尤为明显。 举例: GSM语言话单表,PDATA.TB_NET_GSM_NL 共有73字段,以下SQL供返回1.6亿条记录 左边的SQL,记录最长为:698字节,平均399字节 右边的SQL,记录最长为:59字节, 平均30字节 两者相差400多GB的SPOOL空间,IO次数也随着相差甚大!,SPOOL空间估计:497 GB,SPOOL空间估计:42 GB,SE
20、LECT SUBS_ID ,MSISDN ,Begin_Date ,Begin_Time ,Call_DUR ,CHRG_DUR FROM PDATA.TB_NET_GSM_NL WHERE PROC_DATE BETWEEN 20070701 AND 20070731,SELECT * FROM PDATA.TB_NET_GSM_NL WHERE PROC_DATE BETWEEN 20070701 AND 20070731,Where条件的限定,根据Where条件先进行过滤数据集,再进行连接(JOIN)等操作 这样,可以减少参与连接操作的数据集大小,从而提高效率 好的查询引擎,可以自动优化
21、;但有些复杂SQL,查询引擎优化得并不好。 注意:系统的SQL优化,只是避免最差的,选择相对优的,未必能够得到最好的优化结果。,SELECT A.TX_DATE, A.KPI_CODE ,B.SRC_NAME,A.KPI_VALUE FROM ( select * from qdata.tb_dqc_kpi_check_result where TX_DATE = 20070701 AND KPI_CODE = 65 ) A LEFT JOIN ( SELECT * FROM qdata.tb_dqc_kpi_def where KPI_CODE = 65 and N_TYPE = M ) B
22、 ON A.KPI_CODE = B.KPI_CODE,SELECT A.TX_DATE, A.KPI_CODE ,coalesce(B.SRC_NAME, no name) ,A.KPI_VALUE FROM qdata.tb_dqc_kpi_check_result A LEFT JOIN qdata.tb_dqc_kpi_def B ON A.KPI_CODE = B.KPI_CODE WHERE A. TX_DATE = 20070701 AND A.KPI_CODE = 65 AND B.N_TYPE = M,rewrite,用Case When替代UNION,sel city_id
23、,channel_id,cust_brand_id,sum(stat_values) as stat_values from ( . select t.city_id -语音杂志计费量 ,coalesce(v.channel_id,b.channel_id,-) as channel_id ,cust_brand_id ,sum(case when SMS_SVC_Type_Level_SECND = 017 and Call_Type_Code in (00,10,01,11) then sms_quan else 0 END) as stat_values from PVIEW.vw_mi
24、d_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_CDE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 group by 1,2,3 union all select t.city_id -梦网短信计费量 ,coalesce(v.channel_id,b.channel_id,-) as channel_id ,cust_brand_id ,sum(sms_quan) as stat_v
25、alues from PVIEW.vw_mid_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_CDE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 and SMS_SVC_Type_Level_SECND like 02% and SMS_SVC_Type_Level_SECND not in (021,022) group by 1,2,3 . )tmp Group by 1,2,3,
26、两个子查询的表连接部分完全一样 两个子查询除了取数据条件,其它都一样。 Union all是多余的,它需要重复扫描数据,进行重复的JOIN 可以用Case when替代union,作业:KPI_NWR_SMS_BILL_QUAN 描述:点对点短信计费量 脚本: kpi_nwr_sms_bill_quan0600.pl,用Case When替代UNION (cont.),sel city_id,channel_id,cust_brand_id,sum(stat_values) as stat_values from ( select t.city_id ,coalesce(v.channel_i
27、d,b.channel_id,-) as channel_id ,cust_brand_id ,sum(CASE WHEN SMS_SVC_Type_Level_SECND = 017 and Call_Type_Code in (00,10,01,11) THEN sms_quan -语音杂志计费量 WHEN SMS_SVC_Type_Level_SECND like 02% and SMS_SVC_Type_Level_SECND not in (021,022) THEN sms_quan -梦网短信计费量 ELSE 0 END ) as stat_values from PVIEW.v
28、w_mid_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_CDE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 . )tmp Group by 1,2,3,SQL优化重写,用OR替代UNION,Select city_id , channel_id, cust_brand_id, sum(sms_quan ) stat_values from( select t.city_id -语音杂
29、志计费量 ,coalesce(v.channel_id,b.channel_id,-) as channel_id ,cust_brand_id ,sum(sms_quan ) stat_values from PVIEW.vw_mid_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_CDE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 and SMS_SVC_Type_Level_SEC
30、ND = 017 and Call_Type_Code in (00,10,01,11) group by 1,2,3 union all select t.city_id -梦网短信计费量 ,coalesce(v.channel_id,b.channel_id,-) as channel_id ,cust_brand_id ,sum(sms_quan) as stat_values from PVIEW.vw_mid_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_C
31、DE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 and SMS_SVC_Type_Level_SECND like 02% and SMS_SVC_Type_Level_SECND not in (021,022) group by 1,2,3 )T Group by 1,2,3,两个子查询的表连接部分完全一样 两个子查询除了取数据条件,其它都一样。 Union all是多余的,它需要重复扫描数据,进行重复的JOIN 可以用OR替代union 此类的问题,在脚本中经常见到。,用OR替代UNION (cont.
32、),select t.city_id ,coalesce(v.channel_id,b.channel_id,-) as channel_id ,cust_brand_id ,sum( sms_quan) as stat_values from PVIEW.vw_mid_sms_svc_quan_daily t left join VT_SUBS v on t.subs_id=v.subs_id left join PVIEW.vw_FCT_CDE_BUSN_CITY_TYPE b on t.city_id=b.City_ID where cal_date=20070914 and ( SMS
33、_SVC_Type_Level_SECND = 017 -语音杂志计费量 and Call_Type_Code in (00,10,01,11) ) OR (SMS_SVC_Type_Level_SECND like 02% -梦网短信计费量 and SMS_SVC_Type_Level_SECND not in (021,022) ) ) Group by 1,2,3,SQL优化重写,去掉多余的Distinct与Group by,sel t.operator ,t.acpt_channel_id ,t.acpt_city_id ,t.subs_id ,t.acpt_date as evt_d
34、ate From ( sel operator, ACPT_Channel_ID, acpt_city_id,subs_id, acpt_date from pview.vw_evt_cust_so cust where acpt_date =20071007 and so_meth_code in(0,1,2) and PROC_STS_Code =-1 group by 1,2,3,4,5 union all sel operator_num as operator, ACPT_Channel_ID, acpt_city_id, subs.subs_id, charge_date as a
35、cpt_date from pview.vw_fin_busi_rec bus join crmmart.subs_day_info_daily subs on subs.msisdn=bus.msisdn where charge_date =20071007 group by 1,2,3,4,5 )t group by 1,2,3,4,5;,既然t查询外层有group by操作去重,那么子查询内的Group by去重是多余的。 而且,两个子查询group by后再用union all,就可能再产生重复记录,那么group by也失去意义了。 解决方法: 把t查询内部的两个group by去
36、掉即可 类似的Distinct问题,可效仿解决。,去重,去重,去重,Group by vs. Distinct,Distinct是去除重复的操作 Group by是聚集操作 某些情况下,两者可以起到相同的作用。 两者的执行计划不一样,效率也不一样 建议:使用Group by,select subs_id ,acct_id from PVIEW. VW_FIN_ACCT_SUBS_HIS where efct_date 20070701 group by 1,2,select DISTINCT subs_id ,acct_id from PVIEW. VW_FIN_ACCT_SUBS_HIS w
37、here efct_date 20070701,Union vs. Union all,Union与Union all的作用是将多个SQL的结果进行合并。 Union将自动剔除集合操作中的重复记录;需要耗更多资源。 Union all则保留重复记录,一般建议使用Union all。 第一个SELECT语句,决定输出的字段名称,标题,格式等 要求所有的SELECT语句: 1) 必须要有同样多的表达式数目; 2) 相关表达式的域必须兼容,select * from (select a) T1(col1) union select * from (select bc)T2(col2),select
38、* from (select bc)T3(col3) union all select * from (select a) T1(col1) union all select * from (select bc)T2(col2),col3 - a bc bc,col1 - a b,先Group by再join,脚本:rpt_mart_new_comm_mon0400.pl 11小时 Select case when b.CUST_Brand_ID is null then 5020 when b.CUST_Brand_ID in(2000,5010) then 5020 else b.CUST
39、_Brand_ID end ,sum(COALESCE(b.Bas_CHRG_DUR_Unit,0) as Thsy_Accum_New_SUBS_CHRG_DUR , sum(case when b.call_type_code =20 then b.Bas_CHRG_DUR_Unit else 0 END) from VTNEW_SUBS_THISYEAR t inner join VTDUR_MON b on t.Subs_ID=b.Subs_ID left join PVIEW.vw_MID_CDE_LONG_CALL_TYPE_LVL c on b.Long_Type_Level_S
40、ECND= c.Long_Type_Level_SECND left join PVIEW.vw_MID_CDE_ROAM_TYPE_LVL d on b.Roam_Type_Level_SECND= d.Roam_Type_Level_SECND group by 1;,记录数情况: t: 580万,b: 9400万, c:8, d:8 主要问题: 假如连接顺序为: ( (b join c) join d) join t) 则是 ( (9400万 join 8) join 8) join 580万) 数据分布时间长(IO多),连接次数多 解决方法: 先执行(t join b),然后group
41、by,再join c,d,先Group by再join (cont.),脚本:rpt_mart_new_comm_mon0400.pl 40秒 Select case when b.CUST_Brand_ID is null then 5020 when b.CUST_Brand_ID in(2000,5010) then 5020 else b.CUST_Brand_ID end ,sum(COALESCE(b.Bas_CHRG_DUR_Unit,0) as Thsy_Accum_New_SUBS_CHRG_DUR , sum(case when b.call_type_code =20 t
42、hen b.Bas_CHRG_DUR_Unit else 0 END) from (select CUST_Brand_ID, call_type_code, Long_Type_Level_SECND, Roam_Type_Level_SECND, sum(Bas_CHRG_DUR_Unit) Bas_CHRG_DUR_Unit, count(*) quan from VTDUR_MON where subs_id in (select subs_id from VTNEW_SUBS_THISYEAR) group by 1,2,3,4 )b left join PVIEW.vw_MID_C
43、DE_LONG_CALL_TYPE_LVL c on b.Long_Type_Level_SECND= c.Long_Type_Level_SECND left join PVIEW.vw_MID_CDE_ROAM_TYPE_LVL d on b.Roam_Type_Level_SECND= d.Roam_Type_Level_SECND group by 1;,记录数情况: t: 580万,b: 9400万, c:8, d:8 处理过程: 先执行(t join b),然后groupby,再join c,d 结果: 1、 VTDUR_MON join VTNEW_SUBS_THISYEAR P
44、I相同,merge join,只需10秒 2、经过group by,b表只有332记录 3、b join c join d, 就是: 332 8 8 4、最终结果:5记录,共40秒,先Group by再join(cont.),先汇总再连接,可以减少参与连接的数据集大小,减少比较次数,从而提高效率。 以下面SQL为例,假设历史表( History )有1亿条记录 左边的SQL,需要进行 1亿 90次比较 右边的SQL,则只需要 1亿 1 次比较,SELECT H.product_id ,sum(H.account_num) FROM History H , Calendar DT WHERE H
45、.sale_date = DT.calendar_date AND DT.quarter = 3 GROUP BY 1 ;,SELECT H.product_id , SUM(H.account_num) FROM History H , (SELECT min(calendar_date) min_date ,max(calendar_date) max_date FROM Calendar WHERE quarter = 3 ) DT WHERE H.sale_date BETWEEN DT.min_date and DT.max_date GROUP BY 1 ;,提取公共SQL形成临时
46、表,脚本:rpt_nmmart_comm_subs_mon0403.pl 出现以下SQL代码段,共5次,平均每次执行需10分钟 。 FROM PVIEW.VW_MID_VOIC_SVC_QUAN_MON a ,PVIEW.VW_MID_CDE_SUBS_BRAND_LVL b ,vt_subs c WHERE a.CUST_Brand_ID=b.SUBS_Brand_Level_Third AND a.CAL_Month=200708 AND a.SUBS_ID=c.SUBS_ID 。 整个脚本需要扫描以下SQL 14次,平均每次执行需3分钟 PVIEW.VW_MID_VOIC_SVC_QUA
47、N_MON where CAL_Month=200708 提取公共SQL,形成临时表,较少扫描(IO)次数。 该脚本,经过优化之后,从50分钟缩减至10分钟,关联条件 (1),Select A.a2, B.b2 from A join B on substring(A.a1 from 1 for 7) = B.b1 应该写为 Select A.a2, B.b2 from (select substring(a1 from 1 for 7) as a1_new ,a2 from A ) A_new join B on a1_new = b1,关联条件 (2),Select A.a2, B.b2
48、from A join B on TRIM(A.a1 ) = TRIM(B.b1) 应该写为 Select A.a2, B.b2 from A join B on A.a1 = B.b1,SQL书写不当可能会引起笛卡儿积,以下面两个SQL为例,它们将进行笛卡儿积操作。 例子1: Select employee.emp_no , employee.emp_name From employee A 例子2: SELECT A.EMP_Name, B.Dept_Name FROM employee A, Department B Where a.dept_no = b.dept_no;,修改表定义,
49、常见的表定义修改操作: 增加字段 修改字段长度 建议的操作流程 Rename table db.tablex as db.tabley; 通过Show table语句获得原表db.tablex的定义 定义新表: db.tablex Insert into db.tablex(。) select 。 From db.tabley; Drop table db.tabley; Teradata提供ALTER TABLE语句,可进行修改表定义 但,不建议采用ALTER TABLE方式。,插入/更新/删除记录时,尽量不要Abort,当目标表有数据时,插入和更新操作,以及部分删除,都产生TJ 如果此时a
50、bort该操作,系统将会回滚,Delete BASS1.tb_03004 where proc_dt = 200709 ;,UPDATE Customer SET Credit_Limit = Credit_Limit * 1.20 ;,DELETE FROM Trans WHERE Trans_Date 990101;,Update/Delete操作,UPDATE Customer SET Credit_Limit = Credit_Limit * 1.20 ;,CREATE multiset TABLE Customer_N AS Customer with no data; INSERT
51、 INTO Customer_N SELECT Credit_Limit * 1.20 FROM Customer ; DROP TABLE Customer ; RENAME TABLE Customer_N TO Customer ;,CREATE multiset TABLE Trans_N as Trans with no data; INSERT INTO Trans_N SELECT * FROM Trans WHERE Trans_Date 981231; DROP TABLE Trans; RENAME TABLE Trans_N TO Trans;,先建立空表,通过inser
52、t / select 方式插入数据这是非常快的操作! 先备份,然后做变更操作,更加安全!,对于大表进行Update/DELETE操作,将耗费相当多的资源与相当长的时间。 Update/Delete操作,需要事务日志TJ(Transient Journal) 以防意外中断导致数据受到破坏 在Update/Delete操作中途被Cancel,系统则需回滚,这将耗更多的资源与时间! 在经分系统中,应严防此类事件发生!,DELETE FROM Trans WHERE Trans_Date 990101;,经分系统的实体命名规范,实体的命名,最长不超过30个字母;通常要求都是大写。 实体的命名:_后缀
53、前缀: 表: 基础表以TB_开头 中间表以MID_开头 应用模块的表以相应的主体缩写开头 视图: 一般地,视图名称与表名称一一对应。 以VW_开头。对于TB_开头的表,把TB_替换成VW;对于其他表,加上VW_即可。 宏:以M_或者Macro_开头 后缀: 历史表:_HIS 月表:_MON 日表:_DAILY,实体的命名规范示例,TB_OFR_SUBS_HIS 用户历史 Efct_date, End_date 示例: Select * From pview.vw_ofr_subs_his Where efct_date cast( 20080401 as date format yyyymmd
54、d) MID_COMP_OPPN_DISTRICT_MON 区域管理月中间表 RPT_CHK_FREE_RES_LOS_DAILY 免费资源促销资料丢失用户表 VW_MID_SUBS_INFO_MON 视图:用户资料月中间表,提纲,Teradata架构 常见问题,及解决方法 Teradata工具实用小技巧 JOIN的实现机制 JOIN的优化,Teradata扩展SQL(1) SHOW,SHOW TABLEpdata.tb_net_gsm_nl ; 显示表pdata.tb_net_gsm_nl的定义,Teradata扩展SQL(2) HELP,HELP DATABASE MIS; 列举数据库MI
55、S的内容 HELP TABLE pdata.tb_net_gsm_nl; 列举该表的字段,Teradata扩展SQL(3) - MACRO,宏(MACRO)是Teradata对ANSI SQL的扩展。 宏(MACRO)是一组SQL的集合 SQL之间用分号”;”隔开 没有if then else语句 与存储过程(Store Procedure)不一样:存储过程类似于C语言,需要先编译,才能执行;而宏不需要。,Teradata扩展SQL(4) 临时表,可变临时表(Volatile Table)是一种比较常用的Teradata临时表 一般用它来存储公共部分的数据,以提高程序的执行效率。 它仅存活于同
56、一个Session之内,INSERT INTO Target_table Select * From ( sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=02 union sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=03 union sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where k
57、pi_code=04 union sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=14 union sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=15 union sel proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=16 union sel proc_dt tx_date
58、, kpi_code , kpi_value from pview.vw_kpi_day where kpi_code=22 ) T1 Where tx_date = 20070701 需要访问表pview.vw_kpi_day 7 次,效率低下!,Teradata扩展SQL(4) 临时表,Create volatile multiset table vt_kpi_day as ( Select proc_dt tx_date, kpi_code , kpi_value from pview.vw_kpi_day where tx_date = 20070701 ) WITH DATA Primary Index(kpi_code ) ON COMMIT PRESERVE ROWS;,INSERT INTO Target_table Select * From ( sel proc_dt tx_date, kpi_code , kpi_value from vt_kpi_day where kpi_code=02 union sel proc_dt tx_date,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 康复辅助技术咨询师成果考核试卷含答案
- 油墨加工工常识竞赛考核试卷含答案
- 偏(均)三甲苯装置操作工工作规范强化考核试卷含答案
- 通信传输设备装调工改进评优考核试卷含答案
- 电光源发光部件制造工标准化评优考核试卷含答案
- 工业废水处理工班组评比知识考核试卷含答案
- 2026年消防工程六月安全生产文明施工方案
- 2026年小学成语故事《对景伤情》情绪感知教学设计教案
- 基金从业资格证券投资基金基础知识历年真题
- 主管护师专业实践能力章节练习与高频考点速记
- 《中华人民共和国水法》解读培训
- 教师信息化培训材料
- 九年级数学教学计划与实施方案
- 危楼拆除安全培训课件
- 开采加工11万吨油砂、生产3万吨沥青油及8万吨尾砂项目可行性研究报告
- 贵州省望谟县2025年上半年公开招聘城市协管员试题含答案分析
- 心率失常教学课件
- 中国石油和化工勘察设计协会电气设计专业委员会公告2025版
- 癫痫的中医护理
- 煤矿许用数码电子雷管及起爆控制器安全标志管理方案(试行)
- 生物安全二级实验室操作规范培训
评论
0/150
提交评论