teradata数据库--常用的数据字典表

(仅供参考,有错误请指出)

teradata使用过程中我们多多少需要查看下 created objects的相关信息,对于查看表结构一句SHOW TABLE TNAME就可以完全胜任。假设我们有诸如一下的需求呢:

  1. 查看那些表是FALLBACK或者NO FALLBACK
  2. 统计下某库下总共有多少个view 多少个Macro 多少个Stored Procedure
  3. 查询表的约束
  4. 查询那些表是以XXXX列为PI的

这时候我们需要借助teradata提供相关数据字典view去完成此类操作。
在此本文列出了teradata中常用的数据字典表,更多的请阅读teradata的官方文档。所有的字典表和视图都在DBC用户下

我们比较常用的字典表视图:

  1. Tables 主要包含了table、view、macros等对象的描述
  2. ShowTblChecks 主要包含了约束类的信息
  3. Columns 主要好包含了表的列、macros的参数等信息
  4. Indices 主要包含了indexed信息
  5. DiskSpace 主要包含数据库级别的AMP的空间信息
  6. TableSize 主要包含表级别的空间信息
  7. PartitioningConstraintsV 主要包含了表的分区信息

有关字典的结构可以SHOW VIEW VNAME 查看

字典Tables 的常用字段:

  1. DatabaseName 所属库
  2. TableName 表名
  3. RequestText 最近一次的DLL语句
  4. TableKind 类型 (T = Table,M = Macro,V = View,J = Journal table,I = Join index,G = Trigger,P = Stored Procedure)
  5. ProtectionType 是否为FALLBACK表, F代表FALLBACK,N为否
  6. JournalFlag 日志分为BEFORE和AFTER,例如值为NN代表BEFORE和AFTER均不作日志记录,NN一个为BEFORE一个为AFTER

解决问题:统计下某库下总共有多少个view 多少个Macro 多少个Stored Procedure
SQL:

SELECT COUNT(TABLENAME)
  FROM DBC.TABLES
 WHERE TABLEKIND = 'T' -- TABLEKIND = 'V'视图  TABLEKIND = 'M'AND DATABANAME = 'XXX'

解决问题:查看那些表是FALLBACK或者NO FALLBACK


SELECT DISTINCT  TRIM(DataBaseName) || '.' || TableName AS TableName
  FROM DBC.TABLES
 WHERE ProtectionType = 'F'  --ProtectionType = 'N'

解决问题:查询某表最近一次做了那些更改
SQL:

SELECT RequestText FROM DBC.TABLES WHERE TableName = 'XXX'

ShowTblChecks 的常用字段:

  1. DataBaseName 所属库
  2. TableName 表名
  3. CheckName 约束名
  4. TblCheck 约束内容

解决问题:产看表的约束
SQL:

SELECT TRIM(DataBaseName) || '.' || TableName AS TableName,
       CheckName,
       TblCheck
  FROM dbc.ShowTblChecks
 WHERE TableName = 'XXXX';

Columns常用的字段:

  1. DataBaseName 所属库
  2. TableName 表名
  3. ColumnName 列名
  4. ColumnFormat 格式化
  5. ColumnTitle title属性
  6. ColumnType 列的类型(
  7. ColumnLength 字段长度
  8. DefaultValue 默认值
  9. DecimalTotalDigits 数字长度
  10. DecimalFractionalDigits 小数位

ColumnType主要类型:

I = INTEGER
F = Float
DA = Date
CV = VARCHAR
I2 = SMALLINT
D = Decimal
CF = Character Fixed(CHAR)
CV = VARCHAR

这些信息足够我们去还原一张表的具体信息
假设我们有这样的需求,统计各个表有多少个指标(类型为Decimal代表指标),是否有时间维度(format 包含 YYYY-MM-DD 的为时间维度)
SQL统计各个表的指标个数:

SELECT TRIM(DataBaseName) || '.' || TableName AS TableName,
       COUNT(ColumnType) AS COUNT_IN
  FROM DBC.Columns
 WHERE ColumnType = 'D'
   AND DATABASENAME = 'XXX'
   --AND TABLENAME = 'XXXX'
 GROUP BY 1

Indices 主要字段:

  1. DatabaseName 所属库
  2. TableName 表名
  3. IndexType 索引类型
  4. UniqueFlag 是否唯一
  5. ColumnName 列名

IndexType

P = Primary
S = Secondary
K = Primary Key
J = Join
U = Unique Constraint

解决问题:查询那些表是以XXXX列为PI的
SQL:

  FROM DBC.Indices
 WHERE IndexType = 'P'
   and ColumnName = 'XXXXX'
   AND DatabaseName = 'XXXXX'

PartitioningConstraintsV主要字段:

  1. DatabaseName 所属库
  2. TableName 表名
  3. ConstraintText 分区信息描述

DiskSpace主要为管理员所有在此略过

TableSize 这张表相对来说比较重要,可以使用此表查询我们建的表PI选择是否合理,主要字段:

  1. Vproc AMP的编号
  2. DataBaseName 所属库
  3. TableName 表名
  4. CurrentPerm 当前空间
  5. PeakPerm 峰值空间

我们知道teradata是MPP架构的数据库,因此它也面临着“木桶效应”的问题。何为木桶效应,简单说就是一个木桶能装多少水并不是由这个木桶最长的那个木板决定,而是有最短的那个决定的。适用在teradata上可以理解为整个数据库的性能并不由最先完成数据处理的节点决定的,而是由那个最慢的节点决定的。因此假设一个节点过慢必将 拖慢整个数据处理的任务。而,“数据倾斜”将引发“木桶效应”,因此我们必须将我们大表的倾斜度控制在一个指标之内。
而利用TableSize 这个视图我们可以检索出我们仓库数据倾斜度不在我们指标之内的。
teradata数据倾斜度的计算方法:Skew = (max-avg)/avg*100

SQL计算数据倾斜度:

SELECT T1.DATABASENAME, --库名
       T1.TABLENAME, --表名       
       T1.SPACE_SUM, --表大小
       T1.SPACE_MAX, --最大AMP大小
       T1.SPACE_AVG, --平均AMP大小
       T1.SKEWFACTOR --PI倾斜度
  FROM (SELECT DATABASENAME,
               TABLENAME,
               SUM(CURRENTPERM) / 1000 / 1000 AS SPACE_SUM,
               MAX(CURRENTPERM) / 1000 / 1000 AS SPACE_MAX,
               AVG(CURRENTPERM) / 1000 / 1000 AS SPACE_AVG,
               (SPACE_MAX - SPACE_AVG) / SPACE_MAX * 100 AS SKEWFACTOR
          FROM DBC.TABLESIZE
         WHERE DATABASENAME = 'DTEMP'
           AND UPPER(TABLENAME) NOT LIKE '%_MI_%'
           AND UPPER(TABLENAME) NOT LIKE '%_MS_%'
         GROUP BY 1, 2) T1
 WHERE T1.SKEWFACTOR >= 30
 ORDER BY SKEWFACTOR DESC;

你可能感兴趣的:(teradata)