在Teradata中创建大型表的最佳实践

在Teradata中创建大型表的最佳实践,teradata,Teradata,我有一个包含1亿行的表,我正试图修改它,以便能够有效地维护和查询它。我们每个月都会得到大约一百万个新的表格行。 我认为我已经正确地设置了它,主索引平均分布行和范围分区,其中一个是按日期,但是当我尝试将表更改为当前日期以添加新分区时,花费了太长的时间 现在我不确定我还应该改变什么。我的理解是,参与PI和分区的每个字段都应该编制索引,并为解析引擎收集统计信息,即使维护这些索引和统计信息需要时间和空间 我曾考虑将日期范围延长几年,以避免更改分区,但我也了解到Teradata不建议这样做 那么我还应该尝

我有一个包含1亿行的表,我正试图修改它,以便能够有效地维护和查询它。我们每个月都会得到大约一百万个新的表格行。 我认为我已经正确地设置了它,主索引平均分布行和范围分区,其中一个是按日期,但是当我尝试将表更改为当前日期以添加新分区时,花费了太长的时间

现在我不确定我还应该改变什么。我的理解是,参与PI和分区的每个字段都应该编制索引,并为解析引擎收集统计信息,即使维护这些索引和统计信息需要时间和空间

我曾考虑将日期范围延长几年,以避免更改分区,但我也了解到Teradata不建议这样做

那么我还应该尝试什么呢?以下是我的create语句:

CREATE SET TABLE STAGE.PartD
     DATABLOCKSIZE = 1048064 BYTES
     (
      Efctv_uniq_id CHAR(13) NOT NULL,
      Cntrct_num CHAR(5) NOT NULL COMPRESS ('H2407','H2416','H2417','H2419','H2422','H2425','H2450','H2456','H2457','H2458','H2459','H2462','H5703','S0522','S4802','S5597','S5601','S5617','S5644','S5660','S5743','S5768','S5803','S5810','S5820','S5884','S5921','S5932','S5960','S5967','S7694'),
      Pbp_id SMALLINT NOT NULL COMPRESS (1 ,2 ,24 ,25 ,42 ,50 ,59 ,83 ,94 ,370 ,122 ,123 ,145 ,162 ,247 ),
      Hicn VARCHAR(20) NOT NULL,
      Cardhldr_id VARCHAR(20) COMPRESS '',
      Ptnt_date_of_birth DATE FORMAT 'YY/MM/DD' COMPRESS ,
      Ptnt_gender_cd CHAR(1) NOT NULL COMPRESS ('0','1','2'),
      Date_of_srvc DATE FORMAT 'YY/MM/DD' NOT NULL,
      Paid_dt DATE FORMAT 'YY/MM/DD' COMPRESS ,
      Product_srvc_id VARCHAR(19) NOT NULL COMPRESS ('~','62175011843','00088222033'),
      Srvc_prvdr_id_qlfyr CHAR(2) NOT NULL COMPRESS ('01','07','99'),
      Srvc_prvdr_id VARCHAR(15) NOT NULL,
      Fill_num BYTEINT NOT NULL COMPRESS (0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ),
      Dspnsng_stus CHAR(1) NOT NULL COMPRESS ' ',
      Cmpnd_cd CHAR(1) COMPRESS '1',
      Daw_prod_slctn_cd CHAR(1) COMPRESS '0',
      Qty_dspnsd CHAR(10) NOT NULL COMPRESS ('0000004000','0000010000','0000014000','0000015000','0000020000','0000028000','0000030000','0000031000','0000045000','0000056000','0000060000','0000090000','0000100000','0000120000','0000180000'),
      Days_suply SMALLINT COMPRESS (0 ,3 ,5 ,7 ,10 ,14 ,15 ,20 ,25 ,28 ,30 ,31 ,34 ,90 ),
      Prscrb_id_qlfyr CHAR(2) COMPRESS ('  ','01','12'),
      Prscrb_id VARCHAR(15) NOT NULL COMPRESS '',
      Drug_cvrg_stus_cd CHAR(1) COMPRESS (' ','C','E','O'),
      Adjsmt_del_cd CHAR(1) COMPRESS (' ','A','D'),
      Non_stand_frmt_cd CHAR(1) COMPRESS (' ','B','C','X'),
      Prcng_excptn_cd CHAR(1) COMPRESS (' ','M','O'),
      Uniq_id CHAR(13) NOT NULL,
      FinalVersionInd CHAR(1),
      LoadID SMALLINT NOT NULL)
PRIMARY INDEX pi ( Efctv_uniq_id ,LoadID )
PARTITION BY ( RANGE_N(LoadID  BETWEEN 1  AND 10000  EACH 1 ),
                            RANGE_N(Date_of_srvc  BETWEEN DATE '2007-01-01' AND ADD_MONTHS((DATE ),(-1 )) EACH INTERVAL '1' MONTH ) )
UNIQUE INDEX ui ( Efctv_uniq_id ,LoadID )
INDEX Efctv_uniq_id ( Efctv_uniq_id )
INDEX Date_of_srvc ( Date_of_srvc )
INDEX LoadID ( LoadID );
我需要在登台环境中使用UI,这样就不允许多次加载相同的数据。我已经从prod环境的表中删除了该索引

avgCurrentPerm为722027691,maxPeakPerm为730772992,skewFactor为0.094412

谢谢你的帮助


将其更改为:

PRIMARY INDEX pi ( Efctv_uniq_id ,LoadID )
PARTITION BY ( 
RANGE_N(LoadID  BETWEEN 644  AND 10000  EACH 1 ),
RANGE_N(Date_of_srvc  BETWEEN DATE '2007-01-01' AND DATE '2030-01-01' 
EACH INTERVAL '1' MONTH ) );
见: 平均电流PERM 377035904最大峰值PERM 377372160倾斜系数0.089105

收集这些数据:

COLLECT STATS 
COLUMN (PARTITION), 
COLUMN (loadid), 
COLUMN (Efctv_uniq_id), 
COLUMN (Date_of_srvc) 
ON STAGE.PartD;

我得到的印象是,使用当前日期创建唯一索引和分区范围是个坏主意

我的理解是,参与PI和 分区应该被索引

不,分区/PI列上的附加索引是无用的

如果您切换到合并而不是插入/更新,您也不需要USI

最后,最好在2030年之前定义srvc的日期,以避免增加范围(您从哪里得到运行Alter Table的建议?)

我的理解是,参与PI和 分区应该被索引

不,分区/PI列上的附加索引是无用的

如果您切换到合并而不是插入/更新,您也不需要USI


最后,最好在2030年之前定义srvc的日期,以避免增加范围(您从哪里得到运行Alter Table的建议?

不确定否决票,如果需要其他信息,我可以提供。除了我已经找到的在Teradata中优化大型表的一般建议之外,我还在寻找其他建议。我不确定下一票,如果需要其他信息,我可以提供。除了我已经找到的优化Teradata中大型表的一般建议之外,我还在多个地方找到了
Alter Table
建议(
Alter Table STAGE.PartD TO CURRENT
,通常是
加insert
delete
),但我现在没有找到任何好的参考资料。我可以删除额外的索引和统计信息,不过,我想我只需要跳过UPI字段集的统计信息。我也可以尝试
合并
,但它不会合并任何行,它们都会被插入。你是说如果我意外地重新加载数据,
MERGE
将覆盖行而不是失败?哦,等等,我不需要索引,但仍然需要收集分区/PI字段的统计数据吗?@Beth:stats仍然需要
MERGE
应该基于目标表的逻辑主键,因此现有行将被更新(或忽略)。我已经看到了
Alter table
建议(
Alter table STAGE.PartD TO CURRENT
,通常是
with insert
delete
)在好几个地方,但我现在找不到任何好的参考资料。我可以删除额外的索引和统计信息,不过,我想我只需要跳过UPI字段集的统计信息。我也可以尝试
合并
,但它不会合并任何行,它们都会被插入。你是说如果我意外地重新加载数据,
MERGE
将覆盖行而不是失败?哦,等等,我不需要索引,但仍然需要收集分区/PI字段的统计数据吗?@Beth:stats仍然需要<代码>合并应基于目标表的逻辑主键,因此将更新(或忽略)现有行。