数据仓库

TD建模系列(一)-TERADATA关键技术知识点

2019-10-12  本文已影响0人  八幡大老师

TERADATA关键知识点梳理

架构

架构图

组件

节点

​ Teradata系统中的每个单独的服务器都称为节点。 节点由自己的操作系统,CPU,内存,自己的Teradata RDBMS软件副本和磁盘空间组成

解析引擎

​ 解析引擎负责从客户端接收查询并准备有效的执行计划: 从客户端接收SQL查询 解析SQL查询检查语法错误 检查用户是否具有针对SQL查询中使用的对象的所需权限 检查在SQL中使用的对象是否确实存在 准备执行计划以执行SQL查询并将其传递给BYNET 从AMP接收结果并发送到客户端

消息传递层

​ BYNET
​ PE和AMP之间以及节点之间的通信
​ 从解析引擎接收执行计划并发送到AMP; 从AMP接收结果并发送到解析引擎

访问模块处理器

​ AMP
​ 虚拟处理器(vprocs)
​ AMP从解析引擎接收数据和执行计划,执行任何数据类型转换,聚合,过滤,排序并将数据存储在与其关联的磁盘中
​ 表中的记录均匀分布在系统中的AMP之间
​ 每个AMP与存储数据的一组磁盘相关联。 只有该AMP可以从磁盘读取/写入数据

存储架构

​ 当客户端运行查询以插入记录时,解析引擎将记录发送到BYNET。 BYNET检索记录并将该行发送到目标AMP

检索体系结构

​ 当客户端运行查询以检索记录时,解析引擎会向BYNET发送请求。 BYNET将检索请求发送到适当的AMP
​ 然后AMPs并行搜索其磁盘并识别所需的记录并发送到BYNET
​ BYNET然后将记录发送到解析引擎,解析引擎又将发送到客户端

Space概念

Permanent Space

​ Permanent Space是用户/数据库保存数据行的最大可用空间量
​ 永久表,日志,回退表和辅助索引子表使用Permanent Space

Spool Space

​ 关键,经常会出现spool不足错误
​ 定义了用户可以使用的最大空间量
​ Spool Space除以AMP的数量。 每当每个AMP限制超过,用户将得到Spool Space错误
​ SpoolSpace是未使用的永久空间,由系统用于保留SQL查询的中间结果。 没有Spool Space的用户无法执行任何查询

Temp Space

​ 临时数据空间
​ 未使用的永久空间,由Global Temporary tables使用

数据保护

​ Teradata使用瞬态日志来保护数据免受事务故障的影响。无论何时运行任何事务,Transient journal都会保留受影响行的before映像的副本,直到事务成功或回滚成功。然后,丢弃之前的图像。瞬时日志保存在每个AMP中。这是一个自动过程,不能禁用。
​ Fallback
​ Down AMP Recovery Journal
​ Cliques
​ Hot Standby Node
​ RAID

访问工具BETO

​ LOGON - 用于登录Teradata系统。
​ ACTIVITYCOUNT - 返回受上一个查询影响的行数。
​ ERRORCODE - 返回上一个查询的状态代码。
​ DATABASE - 设置默认数据库。
​ LABEL - 为一组SQL命令分配一个标签。
​ RUN FILE - 执行文件中包含的查询。
​ GOTO - 将控制转移到标签。
​ LOGOFF - 从数据库注销并终止所有会话。
​ IMPORT - 指定输入文件路径。
​ EXPORT - 指定输出文件路径并启动导出。

表类型

Derived Table

​ 子查询表
​ 在查询中创建,使用和删除。 这些用于在查询中存储中间结果

Volatile Table

​ 会话级临时表
​ 在用户会话中创建,使用和删除Volatile Table。 它们的定义不存储在数据字典中。 它们保存经常使用的查询的中间数据

Global Temporary Table

​ 全局临时表
​ Table的定义存储在数据字典中,并且它们可以被许多用户/会话使用。 但是加载到Global Temporary Table中的数据仅在会话期间保留。 每个会话最多可以实现2000个GlobalTemporaryTable

数据类型

表中的每个列都与数据类型相关联。 数据类型指定将在列中存储什么类型的值。 Teradata支持多种数据类型。 以下是一些常用的数据类型:

数据类型 长度(字节) 值的范围
BYTEINT 1 -1288到+127
SMALLINT 2 -32768到+32767
INTEGER 4 -2,147,483,648到+2147,483,647
BIGINT 8 -9,233,372,036,854,775,80 8到+9,233,372,036,854,775,8 07
DECIMAL 1-16
NUMERIC 1-16
FLOAT 8 IEEE格式
CHAR 固定格式 1-64,000
VARCHAR 变量 1-64,000
DATE 4 YYYYYMMDD
TIME 6或8 HHMMSS.nnnnnn HHMMSS.nnnnnn+HHMM
TIMESTAMP 10或12 YYMMDDHHMMSS.nnnnnn YYMMDDHHMMSS.nnnnnn +HHMM

语法

合并运算符

​ union 或集去重
​ union all 或集
​ intersect 并集
​ minus/except 差集

字符串函数

Teradata提供了几个函数来操作字符串。 这些功能与ANSI标准兼容:

编号 字符串功能和说明
1 ||将字符串连接在一起
2 SUBSTR提取字符串的一部分(Teradata扩展)
3 SUBSTRING提取字符串的一部分(ANSI标准)
4 INDEX查找字符在字符串中的位置(Teradata扩展)
5 POSITION定位字符在字符串中的位置(ANSI标准)
6 TRIM修剪字符串中的空格
7 UPPER将字符串转换为大写
8 LOWER将字符串转换为小写

日期/时间函数

SELECT EXTRACT(YEAR FROM CURRENT_DATE);  
EXTRACT(YEAR FROM Date) 
----------------------- 
        2016  
SELECT EXTRACT(MONTH FROM CURRENT_DATE);  
EXTRACT(MONTH FROM Date) 
------------------------ 
          1        
SELECT EXTRACT(DAY FROM CURRENT_DATE);  
EXTRACT(DAY FROM Date) 
------------------------ 
          1    
       
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP);  
EXTRACT(HOUR FROM Current TimeStamp(6)) 
--------------------------------------- 
                 4      
SELECT EXTRACT(MINUTE FROM CURRENT_TIMESTAMP);  
EXTRACT(MINUTE FROM Current TimeStamp(6)) 
----------------------------------------- 
                 54  
SELECT EXTRACT(SECOND FROM CURRENT_TIMESTAMP);  
EXTRACT(SECOND FROM Current TimeStamp(6)) 
----------------------------------------- 
              27.140000

以下示例将3年添加到当前日期。

SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03' YEAR; 
  Date    (Date+ 3) 
--------  --------- 
16/01/01   19/01/01

以下示例将3年和01个月添加到当前日期。

SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03-01' YEAR TO MONTH; 
 Date     (Date+ 3-01) 
--------  ------------ 
16/01/01    19/02/01

以下示例将01天,05小时和10分钟添加到当前时间戳。

SELECT CURRENT_TIMESTAMP,CURRENT_TIMESTAMP + INTERVAL '01 05:10' DAY TO MINUTE; 
     Current TimeStamp(6)         (Current TimeStamp(6)+ 1 05:10) 
--------------------------------  -------------------------------- 
2016-01-01 04:57:26.360000+00:00  2016-01-02 10:07:26.360000+00:00

COALESCE函数

返回表达式的第一个非空值的语句

表联接 特别的

​ Self Join
​ Cross Join 交叉连接将左表中的每一行连接到右表中的每一行
​ Cartesian Production Join

存储过程

使用call调用

​ 宏是一组SQL语句,通过调用宏名称来存储和执行。 宏的定义存储在数据字典中。 用户只需要EXEC权限来执行宏。 用户不需要对宏中使用的数据库对象具有单独的权限
​ 宏语句作为单个事务执行。 如果宏中的某个SQL语句失败,则所有语句都将回滚。 宏可以接受参数。 宏可以包含DDL语句,但应该是宏中的最后一个语句。

创建语法

CREATE MACRO <macroname> [(parameter1, parameter2,...)] ( <sql statements> );

执行语法

EXEC <macroname>;

参数化宏

​ 类似动态sql引入参数,使用:绑定参数变量
​ 执行 EXEC <macroname>(value);

OLAP函数

​ 就是管道函数

聚合

​ 语法

<aggregate function> OVER   
([PARTITION BY][ORDER BY columnname][ROWS BETWEEN  UNBOUDED PRECEDING AND UNBOUNDED FOLLWOING) 

其聚合函数可以是SUM,COUNT,MAX,MIN,AVG
​ 样例

#以下是查找工资表上NetPay的累计金额的示例。 记录按EmployeeNo排序,累积和计算在NetPay列上
SELECT   EmployeeNo, NetPay,  SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS   UNBOUNDED PRECEDING) as TotalSalary  FROM Salary;
rank

​ 语法

RANK() OVER  ([PARTITION BY columnnlist][ORDER BY columnlist][DESC|ASC])

PARTITION BY子句按照在PARTITION BY子句中定义的列对数据进行分组,并在每个组中执行OLAP功能
​ 样例

以下查询通过加入日期对雇员表的记录进行排序,并在“加入日期”中分配排名。
SELECT EmployeeNo, JoinedDate,RANK()  OVER(ORDER BY JoinedDate) as Seniority  FROM Employee;
以下是使用PARTITION BY子句的查询,每个部门都重置了排名
SELECT EmployeeNo, JoinedDate,RANK()  OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority  FROM Employee;

PI

主索引,分为:

PPI

数据分区
分区主索引
建表时使用PARTITION BY子句用于定义分区:

CREATE SET TABLE Orders (    StoreNo SMALLINT,     OrderNo INTEGER,     OrderDate DATE FORMAT 'YYYY-MM-DD',     OrderTotal INTEGER ) PRIMARY INDEX(OrderNo)  PARTITION BY RANGE_N  (OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY);

SI

二级索引
​ 用于访问数据的备用路径,根据实际情况慎用
差异:
​ 次级索引不涉及数据分发
​ 二级索引值存储在子表中。这些表是在所有AMP中内置的
​ 二级索引是可选的
​ 可以在创建表期间或在创建表之后创建
​ 占用额外的空间,因为它们构建子表,并且它们还需要维护,因为需要为每个新行更新子表
​ 两种类型
​ 唯一二级指数(USI)
​ 非唯一二级指数(NUSI)

FastLoad

​ 数据导入工具
​ 要求:目标表不应该有二级索引,连接索引和外键引用
脚本样例:

LOGON 192.168.1.102/dbc,dbc;      
DATABASE tduser;      
BEGIN LOADING tduser.Employee_Stg         
ERRORFILES Employee_ET, Employee_UV         
CHECKPOINT 10;         
SET RECORD VARTEXT ",";         
DEFINE in_EmployeeNo (VARCHAR(10)),           
in_FirstName (VARCHAR(30)),           
in_LastName (VARCHAR(30)),           
in_BirthDate (VARCHAR(10)),           
in_JoinedDate (VARCHAR(10)),           
in_DepartmentNo (VARCHAR(02)),           
FILE = employee.txt;       
INSERT INTO Employee_Stg (          
EmployeeNo,          
FirstName,          
LastName,          
BirthDate,          
JoinedDate,           
DepartmentNo)        
VALUES (            
:in_EmployeeNo,           
:in_FirstName,           
:in_LastName,           
:in_BirthDate (FORMAT 'YYYY-MM-DD'),           
:in_JoinedDate (FORMAT 'YYYY-MM-DD'),          
:in_DepartmentNo);     
END LOADING;   
LOGOFF;

​ 执行
FastLoad < EmployeeLoad.fl
​ 命令
​ LOGON - 登录到Teradata并启动一个或多个会话。
​ DATABASE - 设置默认数据库。
​ BEGIN LOADING - 标识要加载的表。
​ ERRORFILES - 标识需要创建/更新的2个错误表。
​ CHECKPOINT - 定义何时采取检查点。
​ SET RECORD - 指定输入文件格式是格式化,二进制,文本还是未格式化。
​ DEFINE - 定义输入文件布局。
​ FILE - 指定输入文件名和路径。
​ INSERT - 将输入文件中的记录插入目标表中。
​ END LOADING - 启动FastLoad的第2阶段。 将记录分发到目标表中。
​ LOGOFF - 结束所有会话并终止FastLoad。

FastExport

​ 数据导出工具
脚本样例:

.LOGTABLE tduser.employee_log;   
.LOGON 192.168.1.102/dbc,dbc;      
DATABASE tduser;      
.BEGIN EXPORT SESSIONS 2;         
.EXPORT OUTFILE employeedata.txt         
MODE RECORD FORMAT TEXT;       
SELECT CAST(EmployeeNo AS CHAR(10)),           
CAST(FirstName AS CHAR(15)),           
CAST(LastName AS CHAR(15)),           
CAST(BirthDate AS CHAR(10))          
FROM       
Employee;    
.END EXPORT; 
.LOGOFF;

执行 fexp < employee.fx
命令
​ LOGTABLE - 指定用于重新启动目的的日志表。
​ LOGON - 登录到Teradata并启动一个或多个会话。
​ DATABASE - 设置默认数据库。
​ BEGIN EXPORT - 表示导出的开始。
​ EXPORT - 指定目标文件和导出格式。
​ SELECT - 指定要导出数据的选择查询。
​ END EXPORT - 指定FastExport的结束。
​ LOGOFF - 结束所有会话并终止FastExport。

MultiLoad

性能优化

执行计划

​ 性能调整的第一步是在查询中使用EXPLAIN
​ EXPLAIN计划提供优化程序如何执行查询的详细信息
​ 在解释计划中,检查关键字,如置信度级别,使用的连接策略,假脱机文件大小,重新分配等
​ EXPLAIN命令以英语返回解析引擎的执行计划
​ 当查询前面有EXPLAIN命令时,解析引擎的执行计划将返回给用户,而不是AMP

全表扫描(FTS)

​ 当在SELECT语句中没有指定条件时,优化器可以选择在访问表的每一行时使用全表扫描
EXPLAIN SELECT * FROM employee;

1) First, we lock a distinct TDUSER."pseudo table" for read on a     RowHash to prevent global deadlock for TDUSER.employee.   
2) Next, we lock TDUSER.employee for read.   
3) We do an all-AMPs RETRIEVE step from TDUSER.employee by way of an    all-rows scan with no residual conditions into Spool 1     (group_amps), which is built locally on the AMPs.  The size of     Spool 1 is estimated with low confidence to be 2 rows (116 bytes).      The estimated time for this step is 0.03 seconds.   
4) Finally, we send out an END TRANSACTION step to all AMPs involved     in processing the request.  → The contents of Spool 1 are sent back to the user as the result of     statement 1.  The total estimated time is 0.03 seconds.
唯一主索引

​ 当使用唯一主索引访问行时,则它是一个AMP操作
EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;

1) First, we do a single-AMP RETRIEVE step from TDUSER.employee by     way of the unique primary index "TDUSER.employee.EmployeeNo = 101"     with no residual conditions. The estimated time for this step is     0.01 seconds.   → The row is sent directly back to the user as the result of     statement 1.  The total estimated time is 0.01 seconds.
唯一二级索引

​ 当使用唯一二级索引访问行时,它是一个双放大操作
EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;

1) First, we do a two-AMP RETRIEVE step from TDUSER.Salary     by way of unique index # 4 "TDUSER.Salary.EmployeeNo =     101" with no residual conditions.  The estimated time for this     step is 0.01 seconds.   → The row is sent directly back to the user as the result of     statement 1.  The total estimated time is 0.01 seconds.

​ 附加解读
​ 以下是EXPLAIN计划中常见的术语列表。
... (Last Use) …
​ 不再需要假脱机文件,并且将在此步骤完成后释放。
... with no residual conditions …
​ 所有适用的条件已应用于行。
... END TRANSACTION …
​ 将释放事务锁,并提交更改。
... eliminating duplicate rows ...
​ 重复行仅存在于假脱机文件中,而不是设置表。执行DISTINCT操作。
... by way of a traversal of index #n extracting row ids only …
​ 构建了一个假脱机文件,其中包含在辅助索引(索引#n)中找到的行标识
... we do a SMS (set manipulation step) …
​ 使用UNION,MINUS或INTERSECT运算符组合行。
... which is redistributed by hash code to all AMPs.
​ 重新分配数据以准备加入。
... which is duplicated on all AMPs.
​ 在准备加入时,从较小的表(根据SPOOL)复制数据。
... (one_AMP) or (group_AMPs)
​ 表示将使用一个AMP或AMP子集而不是所有AMP。

统计优化

​ Teradata优化器提出了每个SQL查询的执行策略。 此执行策略基于在SQL查询中使用的表收集的统计信息。 使用COLLECT STATISTICS命令收集表上的统计信息。 优化器需要环境信息和数据人口统计数据来制定最佳执行策略
​ 收集在WHERE子句中使用的列以及在连接条件中使用的列上的统计信息。 收集唯一主索引列的统计信息。 收集非唯一二级索引列的统计信息。优化器将决定是否可以使用NUSI或全表扫描。 收集关于联接索引的统计信息,尽管收集了基表上的统计信息。 收集分区列上的统计信息。

语法

​ 收集语法

COLLECT [SUMMARY] STATISTICS
INDEX (indexname) COLUMN (columnname)
ON <tablename>;

例子:COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;
查看统计:HELP STATISTICS <tablename>;

其他优化方法举例
Data Types

​ 确保使用正确的数据类型。这将避免使用超过所需的过量存储。

Conversion

​ 确保连接条件中使用的列的数据类型兼容,以避免显式数据转换。

Sort

​ 删除不必要的ORDER BY子句,除非必需。

Spool Space Issue

​ 如果查询超过该用户的每个AMP卷轴空间限制,则会生成假脱机空间错误。 验证解释计划并识别占用更多假脱机空间的步骤。 这些中间查询可以拆分并单独放置以构建临时表。

Primary Index

​ 确保为表正确定义了主索引。主索引列应均匀分布数据,应经常用于访问数据。

SET Table

​ 如果定义了SET表,那么优化器将检查记录是否与插入的每个记录重复。要删除重复检查条件,可以为表定义唯一辅助索引。

UPDATE on Large Table

​ 更新大表将是耗时的。可以删除记录,并插入带有修改行的记录,而不是更新表。

Dropping Temporary Tables

​ 删除临时表(临时表)和挥发性(如果不再需要它们)。这将释放永久空间和假脱机空间。

MULTISET Table

​ 如果确定输入记录不具有重复记录,则可以将目标表定义为MULTISET表,以避免SET表使用重复行检查。

压缩

​ 减少表所使用的存储
​ 可以在使用CREATE TABLE创建表时,或使用ALTER TABLE命令创建表之后添加压缩
​ 限制:
​ 每列只能压缩255个值。
​ 主索引列不能压缩。
​ 不能压缩易失性表(临时表)。

多值压缩(MVC)
上一篇下一篇

猜你喜欢

热点阅读