Teradata快速向?qū)?/h1>

2018-01-07 10:32 更新

Teradata - 簡(jiǎn)介

什么是Teradata?

Teradata是受歡迎的關(guān)系數(shù)據(jù)庫管理系統(tǒng)之一。 它主要適用于構(gòu)建大規(guī)模數(shù)據(jù)倉(cāng)庫應(yīng)用程序。 Teradata通過并行性的概念實(shí)現(xiàn)了這一點(diǎn)。 它是由Teradata公司開發(fā)的。

Teradata的歷史

以下是Teradata歷史的快速摘要,列出了主要里程碑。

  • 1979 - 并入Teradata。

  • 1984 - 發(fā)布第一個(gè)數(shù)據(jù)庫計(jì)算機(jī)DBC / 1012。

  • 1986 - 財(cái)富雜志將Teradata命名為“年度產(chǎn)品”。

  • 1999 - 世界上使用Teradata的130千兆字節(jié)的最大數(shù)據(jù)庫。

  • 2002 - Teradata V2R5發(fā)布了分區(qū)主索引和壓縮。

  • 2006 - 推出Teradata主數(shù)據(jù)管理解決方案。

  • 2008 - 使用Active Data Warehousing發(fā)布的Teradata 13.0。

  • 2011 - 收購(gòu)Teradata Aster并進(jìn)入高級(jí)分析空間。

  • 2012 - 推出Teradata 14.0。

  • 2014 - 推出Teradata 15.0。

Teradata的特點(diǎn)

以下是Teradata的一些功能 -

  • 無限并行化 - Teradata數(shù)據(jù)庫系統(tǒng)基于大規(guī)模并行處理(MPP)架構(gòu)。 MPP架構(gòu)在整個(gè)系統(tǒng)上平均分配負(fù)載。 Teradata系統(tǒng)在其進(jìn)程之間分割任務(wù),并并行運(yùn)行它們以確保任務(wù)快速完成。

  • 沒有共享架構(gòu) - Teradata的架構(gòu)稱為共享無架構(gòu)。 Teradata節(jié)點(diǎn),其訪問模塊處理器(AMP)和與AMP相關(guān)聯(lián)的磁盤獨(dú)立工作。 他們不會(huì)與他人分享。

  • 線性可擴(kuò)展性 - Teradata系統(tǒng)具有高度可擴(kuò)展性。 它們可以擴(kuò)展到2048個(gè)節(jié)點(diǎn)。 例如,通過將AMP的數(shù)量加倍,可以使系統(tǒng)的容量增加一倍。

  • 連接 - Teradata可連接到通道連接的系統(tǒng),如主機(jī)或網(wǎng)絡(luò)連接的系統(tǒng)。

  • 成熟優(yōu)化程序 - Teradata優(yōu)化程序是市場(chǎng)上成熟的優(yōu)化程序之一。 它自從開始就被設(shè)計(jì)為平行的。 它已經(jīng)針對(duì)每個(gè)版本進(jìn)行了優(yōu)化。

  • SQL - Teradata支持行業(yè)標(biāo)準(zhǔn)SQL與存儲(chǔ)在表中的數(shù)據(jù)進(jìn)行交互。 除此之外,它提供自己的擴(kuò)展。

  • 強(qiáng)大的實(shí)用工具 - Teradata提供強(qiáng)大的實(shí)用程序,用于從/向Teradata系統(tǒng)導(dǎo)入/導(dǎo)出數(shù)據(jù),例如FastLoad,MultiLoad,F(xiàn)astExport和TPT。

  • 自動(dòng)分發(fā) - Teradata自動(dòng)將數(shù)據(jù)均勻分發(fā)到磁盤,而無需任何手動(dòng)干預(yù)。

Teradata - 簡(jiǎn)介...

Teradata為VMWARE提供Teradata express,這是一個(gè)完全可操作的Teradata虛擬機(jī)。 它提供高達(dá)1 TB的存儲(chǔ)。 Teradata提供40GB和1TB版本的VMware。

先決條件

由于VM是64位,因此您的CPU必須支持64位。

Windows的安裝步驟

步驟1 - 從鏈接 “nofollow”target =“_ blank”> http://downloads.teradata.com/download/database/teradata-express-for-vmware-player

步驟2 - 解壓縮文件并指定目標(biāo)文件夾。

步驟3 - 從鏈接 > https://my.vmware.com/web/vmware/downloads 。 它可用于Windows和Linux。 下載適用于Windows的VMWARE工作站播放器。

VMWare Workstation player

步驟4 - 下載完成后,安裝軟件。

步驟5 - 安裝完成后,運(yùn)行VMWARE客戶端。

步驟6 - 選擇“打開虛擬機(jī)”。 瀏覽提取的Teradata VMWare文件夾,然后選擇擴(kuò)展名為.vmdk的文件。

Open Virtual Machine

步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機(jī)”。

Play Virtual Machine

步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機(jī)”。...

步驟9 - 以root身份輸入用戶名,按tab并以root身份輸入password,然后再次按Enter。

Welcome TDExpress

步驟10 - 一旦桌面上出現(xiàn)以下屏幕,雙擊“root\'s home”。 然后雙擊“Genome\'s Terminal”。 這將打開Shell。

Open Shell

步驟11 - 從以下shell中,輸入命令/etc/init.d/tpa start。 這將啟動(dòng)Teradata服務(wù)器。

Start Teradata server

啟動(dòng)BTEQ

BTEQ實(shí)用程序用于交互式提交SQL查詢。 以下是啟動(dòng)BTEQ實(shí)用程序的步驟。

步驟1 - 輸入命令/ sbin / ifconfig,記下VMWare的IP地址。

步驟2 - 運(yùn)行命令bteq。 在登錄提示符處,輸入命令。

登錄< ip address> / dbc,dbc; 并在密碼提示符下輸入password as dbc;

Starting BTEQ

您可以使用BTEQ登錄Teradata系統(tǒng)并運(yùn)行任何SQL查詢。

Teradata - 架構(gòu)

Teradata架構(gòu)基于大規(guī)模并行處理(MPP)架構(gòu)。 Teradata的主要組件是解析引擎,BYNET和訪問模塊處理器(AMP)。 下圖顯示了Teradata節(jié)點(diǎn)的高級(jí)架構(gòu)。

Teradata Node Architecture

Teradata的組件

Teradata的關(guān)鍵組件如下 -

  • 節(jié)點(diǎn) - 它是Teradata系統(tǒng)中的基本單元。 Teradata系統(tǒng)中的每個(gè)單獨(dú)的服務(wù)器都稱為節(jié)點(diǎn)。 節(jié)點(diǎn)由自己的操作系統(tǒng),CPU,內(nèi)存,自己的Teradata RDBMS軟件副本和磁盤空間組成。 機(jī)柜由一個(gè)或多個(gè)節(jié)點(diǎn)組成。

  • 解析引擎 - 解析引擎負(fù)責(zé)從客戶端接收查詢并準(zhǔn)備有效的執(zhí)行計(jì)劃。 解析引擎的職責(zé)是 -

    • 從客戶端接收SQL查詢

    • 解析SQL查詢檢查語法錯(cuò)誤

    • 檢查用戶是否具有針對(duì)SQL查詢中使用的對(duì)象的所需特權(quán)

    • 檢查在SQL中使用的對(duì)象是否確實(shí)存在

    • 準(zhǔn)備執(zhí)行計(jì)劃以執(zhí)行SQL查詢并將其傳遞給BYNET

    • 從AMP接收結(jié)果并發(fā)送到客戶端

  • 消息傳遞層 - 消息傳遞層稱為BYNET,是Teradata系統(tǒng)中的網(wǎng)絡(luò)層。 它允許PE和AMP之間以及節(jié)點(diǎn)之間的通信。 它從解析引擎接收?qǐng)?zhí)行計(jì)劃并發(fā)送到AMP。 類似地,它從AMP接收結(jié)果并發(fā)送到解析引擎。

  • 訪問模塊處理器(AMP) - 稱為虛擬處理器(vprocs)的AMP是實(shí)際存儲(chǔ)和檢索數(shù)據(jù)的AMP。 AMP從解析引擎接收數(shù)據(jù)和執(zhí)行計(jì)劃,執(zhí)行任何數(shù)據(jù)類型轉(zhuǎn)換,聚合,過濾,排序并將數(shù)據(jù)存儲(chǔ)在與其關(guān)聯(lián)的磁盤中。 表中的記錄均勻分布在系統(tǒng)中的AMP之間。 每個(gè)AMP與存儲(chǔ)數(shù)據(jù)的一組磁盤相關(guān)聯(lián)。 只有該AMP可以從磁盤讀取/寫入數(shù)據(jù)。

存儲(chǔ)架構(gòu)

當(dāng)客戶端運(yùn)行查詢以插入記錄時(shí),解析引擎將記錄發(fā)送到BYNET。 BYNET檢索記錄并將該行發(fā)送到目標(biāo)AMP。 AMP將這些記錄存儲(chǔ)在其磁盤上。 下圖顯示了Teradata的存儲(chǔ)體系結(jié)構(gòu)。

Storage Architecture

檢索體系結(jié)構(gòu)

當(dāng)客戶端運(yùn)行查詢以檢索記錄時(shí),解析引擎會(huì)向BYNET發(fā)送請(qǐng)求。 BYNET將檢索請(qǐng)求發(fā)送到適當(dāng)?shù)腁MP。 然后AMPs并行搜索其磁盤并識(shí)別所需的記錄并發(fā)送到BYNET。 BYNET然后將記錄發(fā)送到解析引擎,解析引擎又將發(fā)送到客戶端。 以下是Teradata的檢索體系結(jié)構(gòu)。

Retrieval Architecture

Teradata - 架構(gòu)...

關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)是一種DBMS軟件,有助于與數(shù)據(jù)庫進(jìn)行交互。 它們使用結(jié)構(gòu)化查詢語言(SQL)與存儲(chǔ)在表中的數(shù)據(jù)進(jìn)行交互。

數(shù)據(jù)庫

數(shù)據(jù)庫是邏輯相關(guān)數(shù)據(jù)的集合。 它們被許多用戶訪問用于不同的目的。 例如,銷售數(shù)據(jù)庫包含有關(guān)存儲(chǔ)在許多表中的銷售的全部信息。

數(shù)據(jù)庫...

表是存儲(chǔ)數(shù)據(jù)的RDBMS中的基本單元。 表是行和列的集合。 以下是employee表的示例。

員工不 名字 生日
101 Mike James 1/5/1980
104 Alex Stuart 11/6/1984
102 Robert Williams 3/5/1983
105 Robert James 12/1/1984
103 Peter Paul 4/1/1983

列包含類似的數(shù)據(jù)。 例如,Employee表中的BirthDate列包含所有雇員的birth_date信息。

生日
1/5/1980
11/6/1984
3/5/1983
12/1/1984
4/1/1983

...

行是所有列的一個(gè)實(shí)例。 例如,在員工表中,一行包含有關(guān)單個(gè)員工的信息。

員工不 名字 生日
101 Mike James 1/5/1980

首要的關(guān)鍵

主鍵用于唯一標(biāo)識(shí)表中的行。 主鍵列中不允許有重復(fù)值,它們不能接受NULL值。 它是表中的必填字段。

首要的關(guān)鍵...

外鍵用于建立表之間的關(guān)系。 子表中的外鍵被定義為父表中的主鍵。 一個(gè)表可以有多個(gè)外鍵。 它可以接受重復(fù)值和空值。 外鍵在表中是可選的。

Teradata - 數(shù)據(jù)類型

表中的每個(gè)列都與數(shù)據(jù)類型相關(guān)聯(lián)。 數(shù)據(jù)類型指定將在列中存儲(chǔ)什么類型的值。 Teradata支持多種數(shù)據(jù)類型。 以下是一些常用的數(shù)據(jù)類型。

數(shù)據(jù)類型 長(zhǎng)度(字節(jié)) 值的范圍
BYTEINT 1 -128至& plus; 127
SMALLINT 2 -32768到& plus; 32767
INTEGER 4 -2,147,483,648至& plus; 2147,483,647
BIGINT 8 -9,233,372,036,854,775,80 8至& plus; 9,233,372,036,854,775,8 07
DECIMAL 1-16 ?
NUMERIC 1-16 ?
FLOAT 8 IEEE格式
CHAR 固定格式 1-64,000
VARCHAR Variable 1-64,000
DATE 4 YYYYYMMDD
TIME 6或8 HHMMSS.nnnnnn HHMMSS.nnnnnn& plus; HHMM
TIMESTAMP 10或12 YYMMDDHHMMSS.nnnnnn YYMMDDHHMMSS.nnnnnn& plus; HHMM

Teradata - 表

關(guān)系模型中的表定義為數(shù)據(jù)集合。 它們表示為行和列。

表類型

類型Teradata支持不同類型的表。

  • 永久表 - 這是默認(rèn)表,它包含用戶插入的數(shù)據(jù),并永久存儲(chǔ)數(shù)據(jù)。

  • 易失性表 - 插入到易失性表中的數(shù)據(jù)僅在用戶會(huì)話期間保留。 在會(huì)話結(jié)束時(shí)刪除表和數(shù)據(jù)。 這些表主要用于在數(shù)據(jù)變換期間保存中間數(shù)據(jù)。

  • 全局臨時(shí)表 - 全局臨時(shí)表的定義是持久的,但是在用戶會(huì)話結(jié)束時(shí)刪除表中的數(shù)據(jù)。

  • 派生表 - 派生表保存查詢中的中間結(jié)果。 它們的生命周期在創(chuàng)建,使用和丟棄它們的查詢中。

設(shè)置Vs Multiset

Teradata基于如何處理重復(fù)記錄將表分類為SET或MULTISET表。 定義為SET表的表不存儲(chǔ)重復(fù)記錄,而MULTISET表可存儲(chǔ)重復(fù)記錄。

值的范圍... 表命令& 描述
1 Create Table

CREATE TABLE命令用于在Teradata中創(chuàng)建表。

2 Alter Table

ALTER TABLE命令用于從現(xiàn)有表中添加或刪除列。

3 Drop Table

DROP TABLE命令用于刪除表。

Teradata - 表...

本章介紹用于操作存儲(chǔ)在Teradata表中的數(shù)據(jù)的SQL命令。

表類型...

INSERT INTO語句用于將記錄插入到表中。

句法

以下是INSERT INTO的通用語法。

INSERT INTO <tablename> 
(column1, column2, column3,…) 
VALUES 
(value1, value2, value3 …);

例子

以下示例將記錄插入到員工表中。

INSERT INTO Employee (
   EmployeeNo, 
   FirstName, 
   LastName, 
   BirthDate, 
   JoinedDate, 
   DepartmentNo 
)
VALUES ( 
   101, 
   'Mike', 
   'James', 
   '1980-01-05', 
   '2005-03-27', 
   01
);

插入上述查詢后,可以使用SELECT語句從表中查看記錄。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980

從另一個(gè)表插入

INSERT SELECT語句用于從另一個(gè)表插入記錄。

例子

以下是INSERT INTO的通用語法。

INSERT INTO <tablename> 
(column1, column2, column3,…) 
SELECT 
column1, column2, column3… 
FROM  
<source table>;

例子

以下示例將記錄插入到員工表中。 在運(yùn)行以下插入查詢之前,創(chuàng)建具有與employee表相同的列定義的名為Employee_Bkup的表。

INSERT INTO Employee_Bkup ( 
   EmployeeNo, 
   FirstName, 
   LastName, 
   BirthDate, 
   JoinedDate, 
   DepartmentNo 
) 
SELECT 
   EmployeeNo, 
   FirstName, 
   LastName, 
   BirthDate, 
   JoinedDate,
   DepartmentNo 
FROM  
   Employee;

當(dāng)執(zhí)行上述查詢時(shí),它將把employee表中的所有記錄插入到employee_bkup表中。

規(guī)則

  • 在VALUES列表中指定的列數(shù)應(yīng)該與INSERT INTO子句中指定的列匹配。

  • NOT NULL列的值是必需的。

  • 如果未指定值,則為可空字段插入NULL。

  • 在VALUES子句中指定的列的數(shù)據(jù)類型應(yīng)與INSERT子句中的列的數(shù)據(jù)類型兼容。

從另一個(gè)表插入...

UPDATE語句用于更新表中的記錄。

句法

以下是UPDATE的通用語法。

UPDATE <tablename> 
SET <columnnamme> = <new value> 
[WHERE condition];

例子

以下示例將員工部門更新為03(對(duì)于員工101)。

UPDATE Employee 
SET DepartmentNo = 03 
WHERE EmployeeNo = 101;

在以下輸出中,您可以看到對(duì)于員工101,部門從1更新為3。

SELECT Employeeno, DepartmentNo FROM Employee; 
*** Query completed. One row found. 2 columns returned. 
*** Total elapsed time was 1 second.  
EmployeeNo    DepartmentNo 
-----------  ------------- 
   101             3 

規(guī)則

  • 您可以更新表的一個(gè)或多個(gè)值。

  • 如果未指定WHERE條件,則表的所有行都受到影響。

  • 您可以使用另一個(gè)表中的值更新表。

刪除記錄

DELETE FROM語句用于更新表中的記錄。

句法

以下是DELETE FROM的通用語法。

DELETE FROM  <tablename> 
[WHERE condition];

例子

以下示例從表employee中刪除員工101。

DELETE FROM Employee 
WHERE EmployeeNo = 101;

在以下輸出中,您可以看到從表中刪除了員工101。

SELECT EmployeeNo FROM Employee;  
*** Query completed. No rows found. 
*** Total elapsed time was 1 second. 

規(guī)則

  • 您可以更新表的一個(gè)或多個(gè)記錄。

  • 如果未指定WHERE條件,則表的所有行都將被刪除。

  • 您可以使用另一個(gè)表中的值更新表。

Teradata - SELECT語句

SELECT語句用于從表中檢索記錄。

句法

以下是SELECT語句的基本語法。

SELECT 
column 1, column 2, ..... 
FROM  
tablename;

例子

考慮下面的employee表。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984

以下是SELECT語句的示例。

SELECT EmployeeNo,FirstName,LastName 
FROM Employee;

執(zhí)行此查詢時(shí),它從employee表中提取EmployeeNo,F(xiàn)irstName和LastName列。

 EmployeeNo            FirstName                       LastName 
-----------  ------------------------------  --------------------------- 
   101                   Mike                            James 
   104                   Alex                            Stuart 
   102                   Robert                          Williams 
   105                   Robert                          James 
   103                   Peter                           Paul

如果要從表中提取所有列,可以使用以下命令,而不是列出所有列。

SELECT * FROM Employee;

上述查詢將從employee表中獲取所有記錄。

WHERE子句

WHERE子句用于過濾SELECT語句返回的記錄。 條件與WHERE子句相關(guān)聯(lián)。 僅返回滿足WHERE子句中的條件的記錄。

例子

以下是具有WHERE子句的SELECT語句的語法。

SELECT * FROM tablename 
WHERE[condition];

例子

以下查詢獲取EmployeeNo為101的記錄。

SELECT * FROM Employee 
WHERE EmployeeNo = 101;

執(zhí)行此查詢時(shí),它返回以下記錄。

 EmployeeNo          FirstName                      LastName 
----------- ------------------------------ ----------------------------- 
   101                 Mike                           James 

ORDER BY

執(zhí)行SELECT語句時(shí),返回的行不按任何特定順序。 ORDER BY子句用于按任何列升序/降序排列記錄。

例子

以下是帶有ORDER BY子句的SELECT語句的語法。

SELECT * FROM tablename 
ORDER BY column 1, column 2..;

例子

以下查詢從employee表中提取記錄,并按FirstName對(duì)結(jié)果排序。

SELECT * FROM Employee 
ORDER BY FirstName;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

 EmployeeNo         FirstName                      LastName 
----------- ------------------------------ ----------------------------- 
    104               Alex                           Stuart 
    101               Mike                           James 
    103               Peter                          Paul 
    102               Robert                         Williams 
    105               Robert                         James 

通過...分組

GROUP BY子句與SELECT語句一起使用,并將類似的記錄安排到組中。

例子

以下是具有GROUP BY子句的SELECT語句的語法。

SELECT column 1, column2 …. FROM tablename 
GROUP BY column 1, column 2..;

例子

以下示例按DepartmentNo列對(duì)記錄進(jìn)行分組,并標(biāo)識(shí)每個(gè)部門的總計(jì)數(shù)。

SELECT DepartmentNo,Count(*) FROM   
Employee 
GROUP BY DepartmentNo;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

 DepartmentNo    Count(*) 
------------  ----------- 
     3             1 
     1             1 
     2             3 

Teradata - SELECT語句...

Teradata支持以下邏輯和條件運(yùn)算符。 這些運(yùn)算符用于執(zhí)行比較和組合多個(gè)條件。

生日... 含義
> 比...更棒
< 少于
>= 大于或等于
<= 小于或等于
= 等于
BETWEEN 如果值在范圍內(nèi)
IN 如果&lt;表達(dá)式&gt;
未輸入 未輸入...
IS NULL IS NULL ...
IS NOT NULL IS NOT NULL ...
AND 組合多個(gè)條件。 僅當(dāng)滿足所有條件時(shí),才評(píng)估為true
OR 組合多個(gè)條件。 如果滿足任一條件,則計(jì)算為true。
NOT 反轉(zhuǎn)條件的含義

之間

BETWEEN命令用于檢查值是否在值的范圍內(nèi)。

例子

考慮下面的employee表。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984

以下示例獲取員工編號(hào)介于101,102和103之間范圍內(nèi)的記錄。

SELECT EmployeeNo, FirstName FROM  
Employee 
WHERE EmployeeNo BETWEEN 101 AND 103;

當(dāng)執(zhí)行上述查詢時(shí),它返回雇員記錄,員工編號(hào)在101和102之間。

*** Query completed. 3 rows found. 2 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo            FirstName 
-----------  ------------------------------ 
   101                   Mike 
   102                   Robert 
   103                   Peter

之間...

IN命令用于根據(jù)給定的值列表檢查值。

例子

以下示例獲取員工編號(hào)為101,102和103的記錄。

SELECT EmployeeNo, FirstName FROM  
Employee 
WHERE EmployeeNo in (101,102,103);

上述查詢返回以下記錄。

*** Query completed. 3 rows found. 2 columns returned. 
*** Total elapsed time was 1 second.  
 EmployeeNo            FirstName 
-----------  ------------------------------ 
   101                   Mike 
   102                   Robert 
   103                   Peter

不是

NOT IN命令反轉(zhuǎn)IN命令的結(jié)果。 它獲取的值與給定列表不匹配的記錄。

例子

以下示例獲取員工編號(hào)不在101,102和103中的記錄。

SELECT * FROM  
Employee 
WHERE EmployeeNo not in (101,102,103);

上述查詢返回以下記錄。

*** Query completed. 2 rows found. 6 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo          FirstName                      LastName 
----------- ------------------------------ -----------------------------    
    104                Alex                          Stuart 
    105                Robert                        James 

Teradata - SET運(yùn)算符

SET運(yùn)算符合并多個(gè)SELECT語句的結(jié)果。 這可能看起來類似于連接,但連接組合來自多個(gè)表的列,而SET運(yùn)算符組合來自多個(gè)行的行。

規(guī)則

  • 每個(gè)SELECT語句的列數(shù)應(yīng)該相同。

  • 每個(gè)SELECT的數(shù)據(jù)類型必須兼容。

  • ORDER BY應(yīng)該只包含在最終的SELECT語句中。

不是...

UNION語句用于組合多個(gè)SELECT語句的結(jié)果。 它忽略重復(fù)。

句法

下面是UNION語句的基本語法。

SELECT col1, col2, col3… 
FROM  
<table 1> 
[WHERE condition] 
UNION  

SELECT col1, col2, col3… 
FROM  
<table 2> 
[WHERE condition];

例子

考慮下面的員工表和工資表。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984
員工不 ... NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

以下UNION查詢組合Employee和Salary表中的EmployeeNo值。

SELECT EmployeeNo 
FROM  
Employee 
UNION 

SELECT EmployeeNo 
FROM  
Salary;

執(zhí)行查詢時(shí),將生成以下輸出。

EmployeeNo 
----------- 
   101 
   102 
   103 
   104 
   105

UNION ALL

UNION ALL語句與UNION類似,它合并來自多個(gè)表(包括重復(fù)行)的結(jié)果。

例子

以下是UNION ALL語句的基本語法。

SELECT col1, col2, col3… 
FROM  
<table 1> 
[WHERE condition] 
UNION ALL 

SELECT col1, col2, col3…
FROM  
<table 2> 
[WHERE condition];

例子

以下是UNION ALL語句的示例。

SELECT EmployeeNo 
FROM  
Employee 
UNION ALL 

SELECT EmployeeNo 
FROM  
Salary;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 你可以看到它也返回重復(fù)。

 EmployeeNo 
----------- 
    101 
    104 
    102 
    105 
    103 
    101 
    104 
    102 
    103

UNION ALL...

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 你可以看到它也返回重復(fù)。...

例子

以下是INTERSECT語句的基本語法。

SELECT col1, col2, col3… 
FROM  
<table 1>
[WHERE condition] 
INTERSECT 

SELECT col1, col2, col3… 
FROM  
<table 2> 
[WHERE condition];

例子

以下是INTERSECT語句的示例。 它返回兩個(gè)表中存在的EmployeeNo值。

SELECT EmployeeNo 
FROM  
Employee 
INTERSECT 

SELECT EmployeeNo 
FROM  
Salary; 

當(dāng)執(zhí)行上述查詢時(shí),它返回以下記錄。 EmployeeNo 105被排除,因?yàn)樗淮嬖谟赟ALARY表中。

EmployeeNo 
----------- 
   101 
   104 
   102 
   103 

MINUS / EXCEPT

MINUS / EXCEPT命令組合多個(gè)表中的行,并返回第一個(gè)SELECT但不包含第二個(gè)SELECT的行。 它們都返回相同的結(jié)果。

例子

以下是MINUS語句的基本語法。

SELECT col1, col2, col3… 
FROM  
<table 1> 
[WHERE condition] 
MINUS 

SELECT col1, col2, col3… 
FROM  
<table 2> 
[WHERE condition];

例子

以下是MINUS語句的示例。

SELECT EmployeeNo 
FROM  
Employee 
MINUS 

SELECT EmployeeNo 
FROM  
Salary;

執(zhí)行此查詢時(shí),它返回以下記錄。

EmployeeNo 
----------- 
   105 

Teradata - SET運(yùn)算符...

Teradata提供了幾個(gè)函數(shù)來操作字符串。 這些功能與ANSI標(biāo)準(zhǔn)兼容。

NetPay... 字符串函數(shù)&amp; 描述
1 ||

將字符串連接在一起

2 SUBSTR

提取字符串的一部分(Teradata擴(kuò)展)

3 SUBSTRING

提取字符串的一部分(ANSI標(biāo)準(zhǔn))

4 INDEX

查找字符在字符串中的位置(Teradata擴(kuò)展)

5 POSITION

定位字符在字符串中的位置(ANSI標(biāo)準(zhǔn))

6 TRIM

修剪字符串中的空格

7 UPPER

將字符串轉(zhuǎn)換為大寫

8 LOWER

將字符串轉(zhuǎn)換為小寫

例子

下表列出了一些帶有結(jié)果的字符串函數(shù)。

字符串函數(shù)&amp; 描述... 結(jié)果
SELECT SUBSTRING(\'warehouse\'FROM 1 FOR 4) Ware
SELECT SUBSTR(\'warehouse\',1,4) Ware
SELECT\'data\'|| \'\'|| \'倉(cāng)庫\' SELECT\'data\'|| \'\'|| \'倉(cāng)庫\'...
SELECT UPPER(\'data\') DATA
SELECT LOWER(\'DATA\') Data

Teradata - 日期/時(shí)間函數(shù)

本章討論Teradata中可用的日期/時(shí)間功能。

例子...

日期使用以下公式在內(nèi)部存儲(chǔ)為整數(shù)。

((YEAR - 1900) * 10000) &plus; (MONTH * 100) &plus; DAY

您可以使用以下查詢來檢查日期的存儲(chǔ)方式。

SELECT CAST(CURRENT_DATE AS INTEGER);

由于日期存儲(chǔ)為整數(shù),您可以對(duì)它們執(zhí)行一些算術(shù)運(yùn)算。 Teradata提供執(zhí)行這些操作的函數(shù)。

提取

EXTRACT函數(shù)從DATE值提取日,月和年的部分。 此功能還用于從TIME / TIMESTAMP值提取小時(shí),分鐘和秒。

例子

以下示例顯示如何從日期和時(shí)間戳值提取年,月,日期,小時(shí),分鐘和秒值。

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

提取...

Teradata提供INTERVAL函數(shù)以對(duì)DATE和TIME值執(zhí)行算術(shù)運(yùn)算。 有兩種類型的INTERVAL函數(shù)。

年 - 月間隔

  • YEAR
  • YEAR TO MONTH
  • MONTH

日間隔

  • DAY
  • DAY TO HOUR
  • DAY TO MINUTE
  • DAY TO SECOND
  • HOUR
  • HOUR TO MINUTE
  • HOUR TO SECOND
  • MINUTE
  • MINUTE TO SECOND
  • SECOND

例子

以下示例將3年添加到當(dāng)前日期。

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

以下示例將3年和01個(gè)月添加到當(dāng)前日期。

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

以下示例將01天,05小時(shí)和10分鐘添加到當(dāng)前時(shí)間戳。

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

Teradata - 內(nèi)置函數(shù)

Teradata提供了內(nèi)置函數(shù),這些函數(shù)是SQL的擴(kuò)展。 以下是常見的內(nèi)置函數(shù)。

功能 結(jié)果
SELECT DATE; 日期
--------
16/01/01
SELECT CURRENT_DATE; 日期
--------
16/01/01
選擇時(shí)間; Time
--------
04:50:29
SELECT CURRENT_TIME; 時(shí)間
--------
04:50:29
SELECT CURRENT_TIMESTAMP; 當(dāng)前時(shí)間戳(6)
--------------------------------
2016-01-01 04:
51:06.990000&amp; plus; 00:00
當(dāng)前時(shí)間戳(6)
--------------------------------
2016-01-01 04:
51:06.990000&amp; plus; 00:00...
Database
------------------------------
TDUSER

Teradata - 聚合函數(shù)

Teradata支持公共聚合函數(shù)。 它們可以與SELECT語句一起使用。

  • COUNT - 計(jì)算行數(shù)

  • SUM - 累計(jì)指定列的值

  • MAX - 返回指定列的較大值

  • MIN - 返回所指定列的最小值

  • AVG - 返回指定列的平均值

例子

考慮下面的薪資表。

員工不 扣除 NetPay
101 40,000 4,000 36,000
104 75,000 5,000 70,000
102 80,000 6,000 74,000
105 70,000 4,000 66,000
103 90,000 7,000 83,000

計(jì)數(shù)

以下示例計(jì)算Salary表中的記錄數(shù)。

SELECT count(*) from Salary;  

  Count(*) 
----------- 
    5 

MAX

以下示例返回最大員工凈工資值。

SELECT max(NetPay) from Salary;   
   Maximum(NetPay) 
--------------------- 
       83000 

MAX...

以下示例從薪金表中返回最低雇員凈薪值。

SELECT min(NetPay) from Salary;   

   Minimum(NetPay) 
--------------------- 
        36000

AVG

以下示例返回表中的員工凈薪值的平均值。

SELECT avg(NetPay) from Salary; 
  
   Average(NetPay) 
--------------------- 
       65800 

以下示例計(jì)算員工薪金表中所有記錄的凈工資總和。

SELECT sum(NetPay) from Salary;
  
   Sum(NetPay) 
----------------- 
     329000

Teradata - CASE和COALESCE

本章介紹Teradata的CASE和COALESCE函數(shù)。

CASE表達(dá)式

CASE表達(dá)式根據(jù)條件或WHEN子句計(jì)算每一行,并返回第一個(gè)匹配的結(jié)果。 如果沒有匹配,則返回ELSE部分的結(jié)果。

句法

以下是CASE表達(dá)式的語法。

CASE <expression> 
WHEN <expression> THEN result-1 
WHEN <expression> THEN result-2 

ELSE  
   Result-n 
END

例子

考慮以下Employee表。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984

以下示例計(jì)算DepartmentNo列,如果部門號(hào)為1,則返回值1; 如果部門號(hào)碼為3,則返回2; 否則返回值作為無效部門。

SELECT 
   EmployeeNo, 
CASE DepartmentNo 
   WHEN 1 THEN 'Admin' 
   WHEN 2 THEN 'IT' 
ELSE 'Invalid Dept'
   END AS Department 
FROM Employee; 

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

*** Query completed. 5 rows found. 2 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo    Department 
-----------   ------------ 
   101         Admin 
   104         IT 
   102         IT 
   105         Invalid Dept 
   103         IT

上述CASE表達(dá)式也可以以下面的形式寫出,這將產(chǎn)生與上面相同的結(jié)果。

SELECT 
   EmployeeNo, 
CASE  
   WHEN DepartmentNo = 1 THEN 'Admin' 
   WHEN  DepartmentNo = 2 THEN 'IT' 
ELSE 'Invalid Dept' 
   END AS Department  
FROM Employee;

合并

COALESCE是返回表達(dá)式的第一個(gè)非空值的語句。 如果表達(dá)式的所有參數(shù)計(jì)算結(jié)果為NULL,則返回NULL。 以下是語法。

例子

COALESCE(expression 1, expression 2, ....) 

例子

SELECT 
   EmployeeNo, 
   COALESCE(dept_no, 'Department not found') 
FROM  
   employee;

NULLIF

如果參數(shù)相等,NULLIF語句返回NULL。

例子

以下是NULLIF語句的語法。

NULLIF(expression 1, expression 2) 

例子

如果Department等于3,下面的示例返回NULL。否則,它返回Department No值。

SELECT 
   EmployeeNo,  
   NULLIF(DepartmentNo,3) AS department 
FROM Employee;

上述查詢返回以下記錄。 你可以看到員工105有部門號(hào)。 作為NULL。

*** Query completed. 5 rows found. 2 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo      department 
-----------  ------------------ 
    101              1 
    104              2 
    102              2 
    105              ? 
    103              2

Teradata - 主索引

主索引用于指定數(shù)據(jù)駐留在Teradata中的位置。 它用于指定哪個(gè)AMP獲取數(shù)據(jù)行。 Teradata中的每個(gè)表都需要定義主索引。 如果未定義主索引,Teradata會(huì)自動(dòng)分配主索引。 主索引提供了訪問數(shù)據(jù)的最快方式。 主要最多可以有64列。

在創(chuàng)建表時(shí)定義主索引。 有兩種類型的主索引。

  • Unique Primary Index(UPI)
  • Non Unique Primary Index(NUPI)

NULLIF...

如果表被定義為具有UPI,則被認(rèn)為是UPI的列不應(yīng)該具有任何重復(fù)值。 如果插入任何重復(fù)值,它們將被拒絕。

創(chuàng)建唯一主索引

以下示例使用列EmployeeNo作為唯一主索引創(chuàng)建了“薪金”表。

CREATE SET TABLE Salary ( 
   EmployeeNo INTEGER, 
   Gross INTEGER,  
   Deduction INTEGER, 
   NetPay INTEGER 
) 
UNIQUE PRIMARY INDEX(EmployeeNo);

非唯一主索引(NUPI)

如果表被定義為具有NUPI,則被視為UPI的列可以接受重復(fù)值。

創(chuàng)建非唯一主索引

以下示例創(chuàng)建了將EmployeeNo列作為非唯一主索引的員工帳戶表。 EmployeeNo被定義為非唯一主索引,因?yàn)閱T工在表中可以有多個(gè)帳戶; 一個(gè)用于薪金帳戶,另一個(gè)用于報(bào)銷帳戶。

CREATE SET TABLE Employee _Accounts ( 
   EmployeeNo INTEGER, 
   employee_bank_account_type BYTEINT. 
   employee_bank_account_number INTEGER, 
   employee_bank_name VARCHAR(30), 
   employee_bank_city VARCHAR(30) 
) 
PRIMARY INDEX(EmployeeNo);

Teradata - 加入

聯(lián)接用于組合來自多個(gè)表的記錄。 基于來自這些表的公共列/值來連接表。

有不同類型的聯(lián)接可用。

  • Inner Join
  • Left Outer Join
  • Right Outer Join
  • Full Outer Join
  • Self Join
  • Cross Join
  • Cartesian Production Join

非唯一主索引(NUPI)...

內(nèi)連接組合來自多個(gè)表的記錄,并返回兩個(gè)表中存在的值。

句法

以下是INNER JOIN語句的語法。

SELECT col1, col2, col3…. 
FROM  
Table-1 
INNER JOIN 
Table-2 
ON (col1 = col2) 
<WHERE condition>;

例子

考慮下面的員工表和工資表。

員工不 名字 JoinedDate 部門 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984
員工不 ... NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

以下查詢連接公用列EmployeeS上的Employee表和Salary表。 每個(gè)表被分配一個(gè)別名A&amp; B和列使用正確的別名引用。

SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay 
FROM  
Employee A 
INNER JOIN 
Salary B 
ON (A.EmployeeNo = B. EmployeeNo);

當(dāng)執(zhí)行上述查詢時(shí),它返回以下記錄。 員工105不包括在結(jié)果中,因?yàn)樗谛浇鸨碇袥]有匹配的記錄。

*** Query completed. 4 rows found. 3 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo   DepartmentNo     NetPay 
-----------  ------------   ----------- 
    101           1            36000 
    102           2            74000 
    103           2            83000 
    104           2            70000

外部加入

LEFT OUTER JOIN和RIGHT OUTER JOIN也合并了多個(gè)表的結(jié)果。

  • LEFT OUTER JOIN和RIGHT OUTER JOIN也合并了多個(gè)表的結(jié)果。...

  • RIGHT OUTER JOIN 返回右表中的所有記錄,并僅返回左表中匹配的行。

  • FULL OUTER JOIN 結(jié)合了LEFT OUTER和RIGHT OUTER JOINS的結(jié)果。 它從連接的表返回匹配和不匹配的行。

例子

以下是OUTER JOIN語句的語法。 您需要使用LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL OUTER JOIN中的一個(gè)選項(xiàng)。

SELECT col1, col2, col3…. 
FROM  
Table-1 
LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN 
Table-2 
ON (col1 = col2) 
<WHERE condition>;

例子

以下是OUTER JOIN語句的語法。 您需要使用LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL OUTER JOIN中的一個(gè)選項(xiàng)。...

SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay 
FROM  
Employee A 
LEFT OUTER JOIN 
Salary B 
ON (A.EmployeeNo = B. EmployeeNo) 
ORDER BY A.EmployeeNo; 

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 對(duì)于員工105,NetPay值為NULL,因?yàn)樗谛浇鸨碇袥]有匹配的記錄。

*** Query completed. 5 rows found. 3 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo  DepartmentNo     NetPay 
-----------  ------------   ----------- 
    101           1           36000 
    102           2           74000 
    103           2           83000 
    104           2           70000 
    105           3             ?

CROSS JOIN

交叉連接將左表中的每一行連接到右表中的每一行。

例子

以下是CROSS JOIN語句的語法。

SELECT A.EmployeeNo, A.DepartmentNo, B.EmployeeNo,B.NetPay 
FROM  
Employee A 
CROSS JOIN 
Salary B 
WHERE A.EmployeeNo = 101 
ORDER BY B.EmployeeNo;

以下是CROSS JOIN語句的語法。...

*** Query completed. 4 rows found. 4 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo  DepartmentNo   EmployeeNo    NetPay 
-----------  ------------  -----------  ----------- 
    101           1            101         36000 
    101           1            104         70000 
    101           1            102         74000 
    101           1            103         83000

Teradata - 子查詢

子查詢基于另一個(gè)表中的值從一個(gè)表返回記錄。 它是另一個(gè)查詢中的SELECT查詢。 作為內(nèi)部查詢調(diào)用的SELECT查詢將首先執(zhí)行,結(jié)果將由外部查詢使用。 它的一些突出特點(diǎn)是 -

  • 子查詢基于另一個(gè)表中的值從一個(gè)表返回記錄。 它是另一個(gè)查詢中的SELECT查詢。 作為內(nèi)部查詢調(diào)用的SELECT查詢將首先執(zhí)行,結(jié)果將由外部查詢使用。 它的一些突出特點(diǎn)是 - ...

  • 子查詢不返回重復(fù)記錄。

  • 子查詢不返回重復(fù)記錄。...

句法

以下是子查詢的通用語法。

SELECT col1, col2, col3,… 
FROM  
Outer Table 
WHERE col1 OPERATOR ( Inner SELECT Query);

例子

考慮以下薪資表。

員工不 扣除 NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

以下查詢標(biāo)識(shí)最高薪水的員工編號(hào)。 內(nèi)部SELECT執(zhí)行聚合函數(shù)以返回最大NetPay值,外部SELECT查詢使用此值返回具有此值的雇員記錄。

SELECT EmployeeNo, NetPay 
FROM Salary 
WHERE NetPay =  
(SELECT MAX(NetPay)  
FROM Salary);

執(zhí)行此查詢時(shí),將生成以下輸出。

*** Query completed. One row found. 2 columns returned. 
*** Total elapsed time was 1 second.  
 EmployeeNo     NetPay 
-----------  ----------- 
    103         83000 

Teradata - 表類型

Teradata支持以下表類型來保存臨時(shí)數(shù)據(jù)。

  • Derived Table
  • Volatile Table
  • Global Temporary Table

派生表

Teradata支持以下表類型來保存臨時(shí)數(shù)據(jù)。...

例子

以下示例構(gòu)建具有薪金大于75000的員工的記錄的派生表EmpSal。

SELECT 
Emp.EmployeeNo, 
Emp.FirstName, 
Empsal.NetPay 
FROM 
Employee Emp, 
(select EmployeeNo , NetPay 
from Salary
where NetPay >= 75000) Empsal 
where Emp.EmployeeNo = Empsal.EmployeeNo;

以下示例構(gòu)建具有薪金大于75000的員工的記錄的派生表EmpSal。...

*** Query completed. One row found. 3 columns returned. 
*** Total elapsed time was 1 second. 
 EmployeeNo            FirstName               NetPay 
-----------  ------------------------------  ----------- 
    103                  Peter                 83000 

揮發(fā)性表

在用戶會(huì)話中創(chuàng)建,使用和刪除易失性表。 它們的定義不存儲(chǔ)在數(shù)據(jù)字典中。 它們保存經(jīng)常使用的查詢的中間數(shù)據(jù)。 以下是語法。

例子

CREATE [SET|MULTISET] VOALTILE TABLE tablename 
<table definitions> 
<column definitions> 
<index definitions> 
ON COMMIT [DELETE|PRESERVE] ROWS

例子

CREATE VOLATILE TABLE dept_stat ( 
   dept_no INTEGER, 
   avg_salary INTEGER, 
   max_salary INTEGER, 
   min_salary INTEGER 
) 
PRIMARY INDEX(dept_no) 
ON COMMIT PRESERVE ROWS;

在用戶會(huì)話中創(chuàng)建,使用和刪除易失性表。 它們的定義不存儲(chǔ)在數(shù)據(jù)字典中。 它們保存經(jīng)常使用的查詢的中間數(shù)據(jù)。 以下是語法。...

*** Table has been created. 
*** Total elapsed time was 1 second.

全球臨時(shí)表

全局臨時(shí)表的定義存儲(chǔ)在數(shù)據(jù)字典中,并且它們可以被許多用戶/會(huì)話使用。 但是加載到全局臨時(shí)表中的數(shù)據(jù)僅在會(huì)話期間保留。 每個(gè)會(huì)話最多可以實(shí)現(xiàn)2000個(gè)全局臨時(shí)表。 以下是語法。

例子

CREATE [SET|MULTISET] GLOBAL TEMPORARY TABLE tablename 
<table definitions> 
<column definitions> 
<index definitions> 

例子

CREATE SET GLOBAL TEMPORARY TABLE dept_stat ( 
   dept_no INTEGER, 
   avg_salary INTEGER, 
   max_salary INTEGER, 
   min_salary INTEGER 
) 
PRIMARY INDEX(dept_no);

全局臨時(shí)表的定義存儲(chǔ)在數(shù)據(jù)字典中,并且它們可以被許多用戶/會(huì)話使用。 但是加載到全局臨時(shí)表中的數(shù)據(jù)僅在會(huì)話期間保留。 每個(gè)會(huì)話最多可以實(shí)現(xiàn)2000個(gè)全局臨時(shí)表。 以下是語法。...

*** Table has been created. 
*** Total elapsed time was 1 second.

Teradata - 空間概念

Teradata中有三種類型的空格可用。

永久空間

Teradata中有三種類型的空格可用。...

不為數(shù)據(jù)庫/用戶預(yù)分配永久空間。 它們只是定義為數(shù)據(jù)庫/用戶可以使用的最大空間量。 永久空間的量除以AMP的數(shù)量。 每當(dāng)每個(gè)AMP限制超過,將生成一條錯(cuò)誤消息。

卷軸空間

假脫機(jī)空間是未使用的永久空間,由系統(tǒng)用于保留SQL查詢的中間結(jié)果。 沒有假脫機(jī)空間的用戶無法執(zhí)行任何查詢。

與永久空間類似,假脫機(jī)空間定義了用戶可以使用的最大空間量。 線圈空間除以AMP的數(shù)量。 每當(dāng)每個(gè)AMP限制超過,用戶將得到假脫機(jī)空間錯(cuò)誤。

溫度空間

臨時(shí)空間是未使用的永久空間,由全局臨時(shí)表使用。 溫度空間也除以AMP的數(shù)量。

Teradata - 空間概念...

表只能包含一個(gè)主索引。 更多情況下,您會(huì)遇到表包含其他列的情況,使用這些列來頻繁訪問數(shù)據(jù)。 Teradata將對(duì)這些查詢執(zhí)行全表掃描。 輔助索引解決此問題。

輔助索引是訪問數(shù)據(jù)的備用路徑。 主索引和輔助索引之間存在一些差異。

  • 次級(jí)索引不涉及數(shù)據(jù)分發(fā)。

  • 輔助索引值存儲(chǔ)在子表中。 這些表是在所有AMP中內(nèi)置的。

  • 輔助索引是可選的。

  • 它們可以在創(chuàng)建表期間或在創(chuàng)建表之后創(chuàng)建。

  • 它們占用額外的空間,因?yàn)樗鼈儤?gòu)建子表,并且它們還需要維護(hù),因?yàn)樾枰獮槊總€(gè)新行更新子表。

有兩種類型的輔助索引 -

  • Unique Secondary Index (USI)
  • Non-Unique Secondary Index (NUSI)

唯一二級(jí)指數(shù)(USI)

唯一輔助索引只允許定義為USI的列的唯一值。 通過USI訪問該行是一個(gè)雙放大操作。

創(chuàng)建唯一二級(jí)索引

以下示例在Employee表的EmployeeNo列上創(chuàng)建USI。

CREATE UNIQUE INDEX(EmployeeNo) on employee;

非唯一二級(jí)指數(shù)(NUSI)

非唯一二級(jí)索引允許定義為NUSI的列的重復(fù)值。 通過NUSI訪問該行是全放大器操作。

創(chuàng)建非唯一二級(jí)索引

以下示例在employee表的FirstName列上創(chuàng)建NUSI。

CREATE INDEX(FirstName) on Employee;

Teradata - 統(tǒng)計(jì)

Teradata優(yōu)化器提出了每個(gè)SQL查詢的執(zhí)行策略。 此執(zhí)行策略基于在SQL查詢中使用的表收集的統(tǒng)計(jì)信息。 使用COLLECT STATISTICS命令收集表上的統(tǒng)計(jì)信息。 優(yōu)化器需要環(huán)境信息和數(shù)據(jù)人口統(tǒng)計(jì)數(shù)據(jù)來制定最佳執(zhí)行策略。

環(huán)境信息

  • Number of Nodes, AMPs and CPUs
  • Amount of memory

數(shù)據(jù)人口統(tǒng)計(jì)

  • Number of rows
  • Row size
  • Range of values in the table
  • Number of rows per value
  • Number of Nulls

有三種方法來收集表上的統(tǒng)計(jì)信息。

  • Random AMP Sampling
  • Full statistics collection
  • Using SAMPLE option

收集統(tǒng)計(jì)

COLLECT STATISTICS命令用于收集表上的統(tǒng)計(jì)信息。

句法

以下是收集表上的統(tǒng)計(jì)信息的基本語法。

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

例子

以下示例收集Employee表的EmployeeNo列的統(tǒng)計(jì)信息。

COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

*** Update completed. 2 rows changed. 
*** Total elapsed time was 1 second.

查看統(tǒng)計(jì)信息

您可以使用HELP STATISTICS命令查看收集的統(tǒng)計(jì)信息。

例子

以下是查看收集的統(tǒng)計(jì)信息的語法。

HELP STATISTICS <tablename>; 

例子

以下是查看在Employee表上收集的統(tǒng)計(jì)信息的示例。

HELP STATISTICS employee;

當(dāng)執(zhí)行上述查詢時(shí),它產(chǎn)生以下結(jié)果。

  Date       Time      Unique Values           Column Names 
--------   -------- -------------------- ----------------------- 
16/01/01   08:07:04         5                       * 
16/01/01   07:24:16         3                   DepartmentNo 
16/01/01   08:07:04         5                   EmployeeNo

Teradata - 統(tǒng)計(jì)...

壓縮用于減少表所使用的存儲(chǔ)。 在Teradata中,壓縮最多可以壓縮255個(gè)不同的值,包括NULL。 由于存儲(chǔ)已減少,Teradata可以在塊中存儲(chǔ)更多記錄。 這導(dǎo)致改進(jìn)的查詢響應(yīng)時(shí)間,因?yàn)槿魏蜪 / O操作可以每塊處理更多行。 可以在使用CREATE TABLE創(chuàng)建表或使用ALTER TABLE命令創(chuàng)建表之后添加壓縮。

限制

  • Only 255 values can be compressed per column.
  • Primary Index column cannot be compressed.
  • Volatile tables cannot be compressed.

多值壓縮(MVC)

下表壓縮值為1,2和3的字段DepatmentNo。對(duì)列應(yīng)用壓縮時(shí),此列的值不與該行一起存儲(chǔ)。 相反,值存儲(chǔ)在每個(gè)AMP中的表頭中,只有存在位被添加到該行以指示該值。

CREATE SET TABLE employee ( 
   EmployeeNo integer, 
   FirstName CHAR(30), 
   LastName CHAR(30), 
   BirthDate DATE FORMAT 'YYYY-MM-DD-', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD-', 
   employee_gender CHAR(1), 
   DepartmentNo CHAR(02) COMPRESS(1,2,3) 
) 
UNIQUE PRIMARY INDEX(EmployeeNo);

當(dāng)在具有有限值的大表中具有列時(shí),可以使用多值壓縮。

Teradata - 解釋

EXPLAIN命令以英語返回解析引擎的執(zhí)行計(jì)劃。 它可以與除另一個(gè)EXPLAIN命令之外的任何SQL語句一起使用。 當(dāng)查詢前面有EXPLAIN命令時(shí),解析引擎的執(zhí)行計(jì)劃將返回給用戶,而不是AMP。

EXPLAIN的示例

考慮具有以下定義的表Employee。

CREATE SET TABLE EMPLOYEE,FALLBACK ( 
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30), 
   LastName VARCHAR(30),
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );

下面給出了EXPLAIN計(jì)劃的一些示例。

全表掃描(FTS)

當(dāng)在SELECT語句中沒有指定條件時(shí),優(yōu)化器可以選擇在訪問表的每一行時(shí)使用全表掃描。

例子

以下是一個(gè)示例查詢,其中優(yōu)化程序可以選擇FTS。

EXPLAIN SELECT * FROM employee;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 可以看出,優(yōu)化器選擇訪問AMP中的所有AMP和所有行。

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.

唯一主索引

當(dāng)使用唯一主索引訪問行時(shí),則它是一個(gè)AMP操作。

EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 可以看出,它是單AMP檢索,優(yōu)化器使用唯一的主索引訪問該行。

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.

唯一二級(jí)索引

當(dāng)使用唯一二級(jí)索引訪問行時(shí),它是一個(gè)雙放大操作。

例子

考慮具有以下定義的表薪水。

CREATE SET TABLE SALARY,FALLBACK ( 
   EmployeeNo INTEGER, 
   Gross INTEGER, 
   Deduction INTEGER, 
   NetPay INTEGER 
)
PRIMARY INDEX ( EmployeeNo ) 
UNIQUE INDEX (EmployeeNo);

請(qǐng)考慮以下SELECT語句。

EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 可以看出,優(yōu)化器在使用唯一二級(jí)索引的兩個(gè)amp操作中檢索該行。

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計(jì)劃中常見的術(shù)語列表。

...(最后使用)...

不再需要假脫機(jī)文件,并且將在此步驟完成后釋放。

...沒有殘余條件...

所有適用的條件已應(yīng)用于行。

... END TRANSACTION ...

... END TRANSACTION ... ...

...消除重復(fù)行...

...消除重復(fù)行... ...

...通過遍歷索引#n僅提取行id ... ...

...通過遍歷索引#n僅提取行id ... ... ...

構(gòu)建了一個(gè)假脫機(jī)文件,其中包含在輔助索引(索引#n)中找到的行標(biāo)識(shí)...

...我們做一個(gè)短信(設(shè)置操作步驟)... ...

...由散列碼重新分配給所有AMP。

...由散列碼重新分配給所有AMP。...

...在所有AMP上重復(fù)。

在準(zhǔn)備加入時(shí),從較小的表(根據(jù)SPOOL)復(fù)制數(shù)據(jù)。

...(one_AMP)或(group_AMPs)

...(one_AMP)或(group_AMPs)...

Teradata - 解釋...

基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個(gè)AMP獲取行。

基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個(gè)AMP獲取行。...

Hashing Algorithm

以下是插入數(shù)據(jù)的步驟。

  • 以下是插入數(shù)據(jù)的步驟。...

  • 解析器接收查詢并將記錄的PI值傳遞給散列算法。

  • 解析器接收查詢并將記錄的PI值傳遞給散列算法。...

  • 行散列(前16位)的高階位用于標(biāo)識(shí)散列映射條目。 哈希映射包含一個(gè)AMP#。 哈希映射是包含特定AMP#的桶的數(shù)組。

  • BYNET將數(shù)據(jù)發(fā)送到標(biāo)識(shí)的AMP。

  • AMP使用32位行散列來定位其磁盤中的行。

  • AMP使用32位行散列來定位其磁盤中的行。...

  • 行散列和唯一性ID的組合稱為行ID。

  • 行散列和唯一性ID的組合稱為行ID。...

  • AMP中的每個(gè)表行都按其行ID進(jìn)行邏輯排序。

如何存儲(chǔ)表

AMP中的每個(gè)表行都按其行ID進(jìn)行邏輯排序。...

行哈希 唯一性ID 員工不 名字 名字...
2A01 2611 0000 0001 101 Mike James
2A01 2612 0000 0001 104 Alex Stuart
2A01 2613 0000 0001 102 Robert Williams
2A01 2614 0000 0001 105 Robert James
2A01 2615 0000 0001 103 Peter Paul

Teradata - JOIN索引

JOIN INDEX是一個(gè)物化視圖。 其定義是永久存儲(chǔ)的,并且只要更新連接索引中引用的基表,就會(huì)更新數(shù)據(jù)。 JOIN INDEX可以包含一個(gè)或多個(gè)表,并且還包含預(yù)聚合數(shù)據(jù)。 連接索引主要用于提高性能。

JOIN INDEX是一個(gè)物化視圖。 其定義是永久存儲(chǔ)的,并且只要更新連接索引中引用的基表,就會(huì)更新數(shù)據(jù)。 JOIN INDEX可以包含一個(gè)或多個(gè)表,并且還包含預(yù)聚合數(shù)據(jù)。 連接索引主要用于提高性能。...

  • Single Table Join Index (STJI)
  • Multi Table Join Index (MTJI)
  • Aggregated Join Index (AJI)

單表連接索引

單表聯(lián)接索引允許基于不同于基表中的主索引列的主索引列來分區(qū)大表。

例子

單表聯(lián)接索引允許基于不同于基表中的主索引列的主索引列來分區(qū)大表。...

CREATE JOIN INDEX <index name> 
AS 
<SELECT Query> 
<Index Definition>;

例子

考慮以下員工和薪資表。

CREATE SET TABLE EMPLOYEE,FALLBACK ( 
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30) , 
   LastName VARCHAR(30) , 
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );

CREATE SET TABLE SALARY,FALLBACK ( 
   EmployeeNo INTEGER, 
   Gross INTEGER, 
   Deduction INTEGER, 
   NetPay INTEGER 
) 
PRIMARY INDEX ( EmployeeNo ) 
UNIQUE INDEX (EmployeeNo);

考慮以下員工和薪資表。...

CREATE JOIN INDEX Employee_JI 
AS 
SELECT EmployeeNo,FirstName,LastName, 
BirthDate,JoinedDate,DepartmentNo 
FROM Employee 
PRIMARY INDEX(FirstName);

如果用戶在EmployeeNo上提交帶有WHERE子句的查詢,那么系統(tǒng)將使用唯一的主索引查詢Employee表。 如果用戶使用employee_name查詢employee表,則系統(tǒng)可以使用employee_name訪問連接索引Employee_JI。 連接索引的行在employee_name列上進(jìn)行散列。 如果未定義連接索引且employee_name未定義為輔助索引,則系統(tǒng)將執(zhí)行全表掃描以訪問耗時(shí)的行。

您可以運(yùn)行以下EXPLAIN計(jì)劃并驗(yàn)證優(yōu)化程序計(jì)劃。 在以下示例中,您可以看到,當(dāng)表使用Employee_Name列查詢時(shí),優(yōu)化程序正在使用Join Index而不是base Employee表。

EXPLAIN SELECT * FROM EMPLOYEE WHERE FirstName='Mike'; 
*** Help information returned. 8 rows. 
*** Total elapsed time was 1 second. 
Explanation 
------------------------------------------------------------------------ 
   1) First, we do a single-AMP RETRIEVE step from EMPLOYEE_JI by 
      way of the primary index "EMPLOYEE_JI.FirstName = 'Mike'" 
      with no residual conditions into Spool 1 (one-amp), which is built 
      locally on that AMP.  The size of Spool 1 is estimated with low 
      confidence to be 2 rows (232 bytes).  The estimated time for this 
      step is 0.02 seconds.
   → The contents of Spool 1 are sent back to the user as the result of 
      statement 1.  The total estimated time is 0.02 seconds. 

多表連接索引

您可以運(yùn)行以下EXPLAIN計(jì)劃并驗(yàn)證優(yōu)化程序計(jì)劃。 在以下示例中,您可以看到,當(dāng)表使用Employee_Name列查詢時(shí),優(yōu)化程序正在使用Join Index而不是base Employee表。...

例子

以下示例通過連接Employee和Salary表來創(chuàng)建一個(gè)名為Employee_Salary_JI的JOIN INDEX。

CREATE JOIN INDEX Employee_Salary_JI 
AS 
SELECT a.EmployeeNo,a.FirstName,a.LastName, 
a.BirthDate,a.JoinedDate,a.DepartmentNo,b.Gross,b.Deduction,b.NetPay 
FROM Employee a 
INNER JOIN Salary b 
ON(a.EmployeeNo = b.EmployeeNo) 
PRIMARY INDEX(FirstName);

以下示例通過連接Employee和Salary表來創(chuàng)建一個(gè)名為Employee_Salary_JI的JOIN INDEX。...

聚合聯(lián)接索引

如果表在某些列上始終聚合,則可以在表上定義聚合連接索引以提高性能。 聚合連接索引的一個(gè)限制是它僅支持SUM和COUNT函數(shù)。

例子

在以下示例中,加入員工和工資以確定每個(gè)部門的總工資。

CREATE JOIN INDEX Employee_Salary_JI 
AS 
SELECT a.DepartmentNo,SUM(b.NetPay) AS TotalPay 
FROM Employee a 
INNER JOIN Salary b 
ON(a.EmployeeNo = b.EmployeeNo)
GROUP BY a.DepartmentNo 
Primary Index(DepartmentNo); 

Teradata - JOIN索引...

視圖是由查詢構(gòu)建的數(shù)據(jù)庫對(duì)象。 可以使用單個(gè)表或通過連接的多個(gè)表來構(gòu)建視圖。 它們的定義永久存儲(chǔ)在數(shù)據(jù)字典中,但它們不存儲(chǔ)數(shù)據(jù)的副本。 視圖的數(shù)據(jù)是動(dòng)態(tài)構(gòu)建的。

視圖可以包含表的行的子集或表的列的子集。

創(chuàng)建視圖

視圖是使用CREATE VIEW語句創(chuàng)建的。

例子

下面是創(chuàng)建視圖的語法。

CREATE/REPLACE VIEW <viewname> 
AS  
<select query>; 

例子

考慮以下Employee表。

員工不 名字 ...
101 Mike James 1/5/1980
104 Alex Stuart 11/6/1984
102 Robert Williams 3/5/1983
105 Robert James 12/1/1984
103 Peter Paul 4/1/1983

以下示例在Employee表上創(chuàng)建視圖。

CREATE VIEW Employee_View 
AS 
SELECT 
EmployeeNo, 
FirstName, 
LastName, 
FROM  
Employee;

使用視圖

以下示例在Employee表上創(chuàng)建視圖。...

例子

以下示例從Employee_View中檢索記錄;

SELECT EmployeeNo, FirstName, LastName FROM Employee_View;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

*** Query completed. 5 rows found. 3 columns returned. 
*** Total elapsed time was 1 second.  
 EmployeeNo            FirstName                       LastName 
-----------  ------------------------------  --------------------------- 
    101                  Mike                           James 
    104                  Alex                           Stuart 
    102                  Robert                         Williams 
    105                  Robert                         James 
    103                  Peter                          Paul 

修改視圖

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。...

以下是修改視圖的語法。

REPLACE VIEW <viewname> 
AS  
<select query>;

例子

以下是修改視圖的語法。...

REPLACE VIEW Employee_View 
AS 
SELECT 
EmployeeNo, 
FirstName, 
BirthDate,
JoinedDate 
DepartmentNo 
FROM  
Employee; 

下降視圖

可以使用DROP VIEW語句刪除現(xiàn)有視圖。

例子

可以使用DROP VIEW語句刪除現(xiàn)有視圖。...

DROP VIEW <viewname>; 

例子

下面是一個(gè)刪除視圖Employee_View的示例。

DROP VIEW Employee_View; 

視圖的優(yōu)點(diǎn)

  • 下面是一個(gè)刪除視圖Employee_View的示例。...

  • 用戶只能訪問視圖而不是基表。

  • 用戶只能訪問視圖而不是基表。...

Teradata - 宏

宏是一組SQL語句,通過調(diào)用宏名稱來存儲(chǔ)和執(zhí)行。 宏的定義存儲(chǔ)在數(shù)據(jù)字典中。 用戶只需要EXEC特權(quán)來執(zhí)行宏。 用戶不需要對(duì)宏中使用的數(shù)據(jù)庫對(duì)象具有單獨(dú)的特權(quán)。 宏語句作為單個(gè)事務(wù)執(zhí)行。 如果宏中的某個(gè)SQL語句失敗,則所有語句都將回滾。 宏可以接受參數(shù)。 宏可以包含DDL語句,但應(yīng)該是宏中的最后一個(gè)語句。

創(chuàng)建宏

宏是一組SQL語句,通過調(diào)用宏名稱來存儲(chǔ)和執(zhí)行。 宏的定義存儲(chǔ)在數(shù)據(jù)字典中。 用戶只需要EXEC特權(quán)來執(zhí)行宏。 用戶不需要對(duì)宏中使用的數(shù)據(jù)庫對(duì)象具有單獨(dú)的特權(quán)。 宏語句作為單個(gè)事務(wù)執(zhí)行。 如果宏中的某個(gè)SQL語句失敗,則所有語句都將回滾。 宏可以接受參數(shù)。 宏可以包含DDL語句,但應(yīng)該是宏中的最后一個(gè)語句。...

句法

以下是CREATE MACRO命令的通用語法。

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

例子

以下是CREATE MACRO命令的通用語法。...

員工不 名字 生日
101 Mike James 1/5/1980
104 Alex Stuart 11/6/1984
102 Robert Williams 3/5/1983
105 Robert James 12/1/1984
103 Peter Paul 4/1/1983

下面的示例創(chuàng)建一個(gè)名為Get_Emp的宏。 它包含一個(gè)select語句來從employee表中檢索記錄。

CREATE MACRO Get_Emp AS ( 
   SELECT 
   EmployeeNo, 
   FirstName, 
   LastName 
   FROM  
   employee 
   ORDER BY EmployeeNo; 
);

執(zhí)行宏

下面的示例創(chuàng)建一個(gè)名為Get_Emp的宏。 它包含一個(gè)select語句來從employee表中檢索記錄。...

例子

以下是EXECUTE MACRO命令的語法。

EXEC <macroname>; 

例子

以下示例執(zhí)行宏名稱Get_Emp; 執(zhí)行以下命令時(shí),它將從employee表中檢索所有記錄。

EXEC Get_Emp; 
*** Query completed. 5 rows found. 3 columns returned. 
*** Total elapsed time was 1 second.  
EmployeeNo             FirstName                      LastName 
-----------  ------------------------------  --------------------------- 
   101                  Mike                          James 
   102                  Robert                        Williams 
   103                  Peter                         Paul 
   104                  Alex                          Stuart 
   105                  Robert                        James 

參數(shù)化宏

Teradata宏可以接受參數(shù)。 在宏內(nèi),這些參數(shù)用引用; (分號(hào))。

Teradata宏可以接受參數(shù)。 在宏內(nèi),這些參數(shù)用引用; (分號(hào))。...

CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( 
   SELECT 
   EmployeeNo, 
   NetPay 
   FROM  
   Salary 
   WHERE EmployeeNo = :EmployeeNo; 
);

執(zhí)行參數(shù)化宏

宏使用EXEC命令執(zhí)行。 您需要EXEC特權(quán)才能執(zhí)行宏。

例子

以下是EXECUTE MACRO語句的語法。

EXEC <macroname>(value);

例子

以下是EXECUTE MACRO語句的語法。...

EXEC Get_Emp_Salary(101); 
*** Query completed. One row found. 2 columns returned. 
*** Total elapsed time was 1 second.
 
EmployeeNo      NetPay 
-----------  ------------ 
   101           36000 

Teradata - 宏...

存儲(chǔ)過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲(chǔ)過程的定義存儲(chǔ)在數(shù)據(jù)庫中,參數(shù)存儲(chǔ)在數(shù)據(jù)字典表中。

優(yōu)點(diǎn)

  • 存儲(chǔ)過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲(chǔ)過程的定義存儲(chǔ)在數(shù)據(jù)庫中,參數(shù)存儲(chǔ)在數(shù)據(jù)字典表中。...

  • 提供更好的安全性,因?yàn)橥ㄟ^存儲(chǔ)過程訪問數(shù)據(jù),而不是直接訪問它們。

  • 提供更好的安全性,因?yàn)橥ㄟ^存儲(chǔ)過程訪問數(shù)據(jù),而不是直接訪問它們。...

執(zhí)行參數(shù)化宏...

存儲(chǔ)過程使用CREATE PROCEDURE語句創(chuàng)建。

句法

存儲(chǔ)過程使用CREATE PROCEDURE語句創(chuàng)建。...

CREATE PROCEDURE <procedurename> ( [parameter 1 data type, parameter 2 data type..] ) 
BEGIN 
   <SQL or SPL statements>; 
END;

例子

考慮下面的薪資表。

員工不 扣除 NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

考慮下面的薪資表。...

CREATE PROCEDURE InsertSalary ( 
   IN in_EmployeeNo INTEGER, IN in_Gross INTEGER, 
   IN in_Deduction INTEGER, IN in_NetPay INTEGER 
) 
BEGIN 
   INSERT INTO Salary ( 
      EmployeeNo, 
      Gross, 
      Deduction, 
      NetPay 
   ) 
   VALUES ( 
      :in_EmployeeNo, 
      :in_Gross, 
      :in_Deduction, 
      :in_NetPay 
   ); 
END;

執(zhí)行程序

存儲(chǔ)過程使用CALL語句執(zhí)行。

例子

以下是CALL語句的通用語法。

CALL <procedure name> [(parameter values)];

例子

以下示例調(diào)用存儲(chǔ)過程InsertSalary,并將記錄插入到“薪金表”中。

CALL InsertSalary(105,20000,2000,18000);

執(zhí)行上述查詢后,它將生成以下輸出,您可以在Salary表中看到插入的行。

員工不 扣除 NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000
105 20,000 2,000 18,000

Teradata - JOIN策略

執(zhí)行上述查詢后,它將生成以下輸出,您可以在Salary表中看到插入的行。...

執(zhí)行程序...

Teradata使用不同的連接方法來執(zhí)行連接操作。 一些常用的Join方法是 -

  • Merge Join
  • Nested Join
  • Product Join

合并加入

Teradata使用不同的連接方法來執(zhí)行連接操作。 一些常用的Join方法是 - ...

例子...

如果連接列是相應(yīng)表的主索引,則連接行已在同一AMP上。 在這種情況下,不需要分配。

如果連接列是相應(yīng)表的主索引,則連接行已在同一AMP上。 在這種情況下,不需要分配。...

CREATE SET TABLE EMPLOYEE,FALLBACK ( 
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30) , 
   LastName VARCHAR(30) , 
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE Salary ( 
   EmployeeNo INTEGER, 
   Gross INTEGER,  
   Deduction INTEGER, 
   NetPay INTEGER 
) 
UNIQUE PRIMARY INDEX(EmployeeNo); 

當(dāng)這兩個(gè)表在EmployeeNo列上連接時(shí),不會(huì)發(fā)生重新分配,因?yàn)镋mployeeNo是正在連接的兩個(gè)表的主索引。

策略#2

當(dāng)這兩個(gè)表在EmployeeNo列上連接時(shí),不會(huì)發(fā)生重新分配,因?yàn)镋mployeeNo是正在連接的兩個(gè)表的主索引。...

CREATE SET TABLE EMPLOYEE,FALLBACK (
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30) , 
   LastName VARCHAR(30) , 
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE DEPARTMENT,FALLBACK ( 
   DepartmentNo BYTEINT, 
   DepartmentName CHAR(15) 
) 
UNIQUE PRIMARY INDEX ( DepartmentNo );

如果這兩個(gè)表在DeparmentNo列上連接,那么這些行需要重新分布,因?yàn)镈epartmentNo是一個(gè)表中的主索引和另一個(gè)表中的非主索引。 在這種情況下,加入行可能不在同一個(gè)AMP上。 在這種情況下,Teradata可能會(huì)在DepartmentNo列重新分發(fā)employee表。

策略#3

如果這兩個(gè)表在DeparmentNo列上連接,那么這些行需要重新分布,因?yàn)镈epartmentNo是一個(gè)表中的主索引和另一個(gè)表中的非主索引。 在這種情況下,加入行可能不在同一個(gè)AMP上。 在這種情況下,Teradata可能會(huì)在DepartmentNo列重新分發(fā)employee表。...

合并加入...

嵌套連接不使用所有AMP。 對(duì)于嵌套連接發(fā)生,其中一個(gè)條件應(yīng)該是一個(gè)表的唯一主索引上的相等,然后將此列連接到另一個(gè)表上的任何索引。

嵌套連接不使用所有AMP。 對(duì)于嵌套連接發(fā)生,其中一個(gè)條件應(yīng)該是一個(gè)表的唯一主索引上的相等,然后將此列連接到另一個(gè)表上的任何索引。...

產(chǎn)品加盟

Product Join將來自一個(gè)表的每個(gè)限定行與來自其他表的每個(gè)限定行進(jìn)行比較。 產(chǎn)品加入可能由于以下某些因素而發(fā)生:

  • Where condition is missing.
  • Join condition is not based on equality condition.
  • Table aliases is not correct.
  • Multiple join conditions.

Teradata - 分區(qū)主索引

分區(qū)主索引(PPI)是一種索引機(jī)制,可用于提高某些查詢的性能。 當(dāng)將行插入到表中時(shí),它們存儲(chǔ)在AMP中并按其行散列順序排列。 當(dāng)使用PPI定義表時(shí),行按其分區(qū)編號(hào)排序。 在每個(gè)分區(qū)中,它們按其行散列排列。 根據(jù)定義的分區(qū)表達(dá)式將行分配給分區(qū)。

產(chǎn)品加盟...

  • 避免對(duì)某些查詢進(jìn)行全表掃描。

  • 避免使用需要額外物理結(jié)構(gòu)和額外I / O維護(hù)的輔助索引。

  • 快速訪問大表的子集。

  • 快速刪除舊數(shù)據(jù)并添加新數(shù)據(jù)。

例子

考慮以下OrderNo主索引的Orders表。

StoreNo 訂單號(hào) 訂購(gòu)日期 合計(jì)訂單
101 7501 2015-10-01 900
101 7502 2015-10-02 1,200
102 7503 2015-10-02 3,000
102 7504 2015-10-03 2,454
101 7505 2015-10-03 1201
103 7506 2015-10-04 2,454
101 7507 2015-10-05 1201
101 7508 2015-10-05 1201

假設(shè)記錄分布在AMP之間,如下表所示。 記錄存儲(chǔ)在AMP中,基于它們的行哈希排序。

AMP 1
RowHash 訂單號(hào) 訂購(gòu)日期
1 7505 2015-10-03
2 7504 2015-10-03
3 7501 2015-10-01
4 7508 2015-10-05

AMP 2
RowHash 訂單號(hào) 訂購(gòu)日期
1 7507 2015-10-05
2 7502 2015-10-02
3 7506 2015-10-04
4 7503 2015-10-02

如果運(yùn)行查詢以提取特定日期的訂單,則優(yōu)化程序可以選擇使用全表掃描,然后可以訪問AMP中的所有記錄。 為了避免這種情況,您可以將訂單日期定義為分區(qū)主索引。 將行插入到訂單表中時(shí),它們按訂單日期進(jìn)行分區(qū)。 在每個(gè)分區(qū)中,它們將按其行哈希排序。

以下數(shù)據(jù)顯示如果記錄按訂單日期分區(qū),則記錄將如何存儲(chǔ)在AMP中。 如果運(yùn)行查詢以按訂單日期訪問記錄,則只會(huì)訪問包含該特定訂單的記錄的分區(qū)。

以下數(shù)據(jù)顯示如果記錄按訂單日期分區(qū),則記錄將如何存儲(chǔ)在AMP中。 如果運(yùn)行查詢以按訂單日期訪問記錄,則只會(huì)訪問包含該特定訂單的記錄的分區(qū)。...

AMP 1
劃分 RowHash 訂單號(hào) 訂購(gòu)日期
0 3 7501 2015-10-01
1 1 7505 2015-10-03
1 2 7504 2015-10-03
2 4 7508 2015-10-05

AMP 2
劃分 RowHash RowHash... 訂購(gòu)日期
0 2 7502 2015-10-02
0 4 7503 2015-10-02
1 3 7506 2015-10-04
2 1 7507 2015-10-05

以下是創(chuàng)建具有分區(qū)primary Index的表的示例。 PARTITION BY子句用于定義分區(qū)。

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
);

在上面的示例中,表由OrderDate列分區(qū)。 每天將有一個(gè)單獨(dú)的分區(qū)。

Teradata - OLAP函數(shù)

OLAP函數(shù)類似于聚合函數(shù),除了聚合函數(shù)只返回一個(gè)值,而OLAP函數(shù)將提供聚合以外的各行。

句法

以下是OLAP函數(shù)的一般語法。

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

聚合函數(shù)可以是SUM,COUNT,MAX,MIN,AVG。

例子

考慮以下薪資表。

員工不 扣除 NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

以下是查找工資表上NetPay的累計(jì)金額或運(yùn)行總計(jì)的示例。 記錄按EmployeeNo排序,累積和計(jì)算在NetPay列上。

SELECT  
EmployeeNo, NetPay, 
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS  
UNBOUNDED PRECEDING) as TotalSalary 
FROM Salary;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

EmployeeNo     NetPay     TotalSalary 
-----------  -----------  ----------- 
   101         36000        36000 
   102         74000        110000 
   103         83000        193000 
   104         70000        263000 
   105         18000        281000 

例子...

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。...

例子

以下是使用RANK函數(shù)的通用語法。

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

例子

考慮以下Employee表。

員工不 名字 JoinedDate DepartmentID 生日
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984

以下查詢通過加入日期對(duì)雇員表的記錄進(jìn)行排序,并在“加入日期”中分配排名。

SELECT EmployeeNo, JoinedDate,RANK() 
OVER(ORDER BY JoinedDate) as Seniority 
FROM Employee;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。

EmployeeNo   JoinedDate   Seniority 
-----------  ----------  ----------- 
   101       2005-03-27       1 
   103       2007-03-21       2 
   102       2007-04-25       3 
   105       2008-01-04       4 
   104       2008-02-01       5 

PARTITION BY子句按照在PARTITION BY子句中定義的列對(duì)數(shù)據(jù)進(jìn)行分組,并在每個(gè)組中執(zhí)行OLAP功能。 以下是使用PARTITION BY子句的查詢的示例。

SELECT EmployeeNo, JoinedDate,RANK() 
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority 
FROM Employee;

當(dāng)執(zhí)行上述查詢時(shí),它將產(chǎn)生以下輸出。 您可以看到每個(gè)部門都重置了排名。

EmployeeNo  DepartmentNo  JoinedDate   Seniority 
-----------  ------------  ----------  ----------- 

    101           1        2005-03-27       1 
    103           2        2007-03-21       1 
    102           2        2007-04-25       2 
    104           2        2008-02-01       3 
    105           3        2008-01-04       1 

Teradata - 數(shù)據(jù)保護(hù)

本章討論Teradata中數(shù)據(jù)保護(hù)的可用功能。

瞬態(tài)雜志

Teradata使用瞬態(tài)日志來保護(hù)數(shù)據(jù)免受事務(wù)故障的影響。 無論何時(shí)運(yùn)行任何事務(wù),Transient journal都會(huì)保留受影響行的before映像的副本,直到事務(wù)成功或回滾成功。 然后,丟棄之前的圖像。 瞬時(shí)日志保存在每個(gè)AMP中。 這是一個(gè)自動(dòng)過程,不能禁用。

倒退

回退通過將表的行的第二副本存儲(chǔ)在稱為回退AMP的另一AMP上來保護(hù)表數(shù)據(jù)。 如果一個(gè)AMP出現(xiàn)故障,則會(huì)訪問回退行。 這樣,即使一個(gè)AMP出現(xiàn)故障,通過備用AMP仍然可以獲得數(shù)據(jù)。 Fallback選項(xiàng)可用于表創(chuàng)建或表創(chuàng)建后。 回退確保表的行的第二副本總是存儲(chǔ)在另一個(gè)AMP中以保護(hù)數(shù)據(jù)免于AMP故障。 但是,回退占用的存儲(chǔ)空間和I / O的兩倍,用于插入/刪除/更新。

下圖顯示了如何將行的后備副本存儲(chǔ)在另一個(gè)AMP中。

Fallback

下降A(chǔ)MP恢復(fù)

當(dāng)AMP故障并且表受回退保護(hù)時(shí),將激活Down AMP恢復(fù)日志。 此日志記錄對(duì)失敗的AMP的數(shù)據(jù)的所有更改。 在集群中剩余的AMP上激活日志。 這是一個(gè)自動(dòng)過程,不能禁用。 一旦失敗的AMP生效,則來自下行AMP恢復(fù)日志的數(shù)據(jù)與AMP同步。 一旦完成,日志將被丟棄。

Down AMP Recovery Journal

Cliques

Clique是Teradata用來保護(hù)數(shù)據(jù)免受節(jié)點(diǎn)故障的機(jī)制。 clique只是一組共享一組公共磁盤陣列的Teradata節(jié)點(diǎn)。 當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí),來自故障節(jié)點(diǎn)的vprocs將遷移到clique中的其他節(jié)點(diǎn),并繼續(xù)訪問其磁盤陣列。

Cliques...

熱備節(jié)點(diǎn)是不參與生產(chǎn)環(huán)境的節(jié)點(diǎn)。 如果節(jié)點(diǎn)出現(xiàn)故障,則故障節(jié)點(diǎn)的vprocs將遷移到熱備份節(jié)點(diǎn)。 一旦故障節(jié)點(diǎn)恢復(fù),它將成為熱備份節(jié)點(diǎn)。 熱備節(jié)點(diǎn)用于在節(jié)點(diǎn)故障的情況下維持性能。

襲擊

熱備節(jié)點(diǎn)是不參與生產(chǎn)環(huán)境的節(jié)點(diǎn)。 如果節(jié)點(diǎn)出現(xiàn)故障,則故障節(jié)點(diǎn)的vprocs將遷移到熱備份節(jié)點(diǎn)。 一旦故障節(jié)點(diǎn)恢復(fù),它將成為熱備份節(jié)點(diǎn)。 熱備節(jié)點(diǎn)用于在節(jié)點(diǎn)故障的情況下維持性能。...

RAID 1通常用于Teradata。 在RAID 1中,每個(gè)磁盤與鏡像磁盤相關(guān)聯(lián)。 對(duì)主磁盤中的數(shù)據(jù)的任何更改也反映在鏡像副本中。 如果主磁盤發(fā)生故障,則可以訪問來自鏡像磁盤的數(shù)據(jù)。

RAID

Teradata - 用戶管理

本章討論了Teradata中用戶管理的各種策略。

襲擊...

本章討論了Teradata中用戶管理的各種策略。...

例子

以下是CREATE USER的語法。

CREATE USER username 
AS  
[PERMANENT|PERM] = n BYTES 
PASSWORD = password 
TEMPORARY = n BYTES 
SPOOL = n BYTES;

創(chuàng)建用戶時(shí),用戶名,永久空間和密碼的值是必需的。 其他字段是可選的。

例子

以下是創(chuàng)建用戶TD01的示例。

CREATE USER TD01 
AS  
PERMANENT = 1000000 BYTES 
PASSWORD = ABC$124 
TEMPORARY = 1000000 BYTES 
SPOOL = 1000000 BYTES;

帳戶

在創(chuàng)建新用戶時(shí),可以將用戶分配到帳戶。 CREATE USER中的ACCOUNT選項(xiàng)用于分配帳戶。 用戶可以分配到多個(gè)帳戶。

例子

以下是具有帳戶選項(xiàng)的CREATE USER的語法。

CREATE USER username 
PERM = n BYTES 
PASSWORD = password 
ACCOUNT = accountid

例子

以下是具有帳戶選項(xiàng)的CREATE USER的語法。...

CREATE USER TD02 
AS  
PERMANENT = 1000000 BYTES 
PASSWORD = abc$123 
TEMPORARY = 1000000 BYTES 
SPOOL = 1000000 BYTES 
ACCOUNT = (‘IT’,’Admin’);

用戶可以在登錄Teradata系統(tǒng)或使用SET SESSION命令登錄系統(tǒng)后指定帳戶ID。

.LOGON username, passowrd,accountid 
OR 
SET SESSION ACCOUNT = accountid 

帳戶...

GRANT命令用于將數(shù)據(jù)庫對(duì)象的一個(gè)或多個(gè)特權(quán)分配給用戶或數(shù)據(jù)庫。

例子

以下是GRANT命令的語法。

GRANT privileges ON objectname TO username;

特權(quán)可以是INSERT,SELECT,UPDATE,REFERENCES。

例子

以下是GRANT語句的示例。

GRANT SELECT,INSERT,UPDATE ON Employee TO TD01;

撤銷特權(quán)

REVOKE命令從用戶或數(shù)據(jù)庫中刪除特權(quán)。 REVOKE命令只能刪除顯式權(quán)限。

例子

以下是REVOKE命令的基本語法。

REVOKE [ALL|privileges] ON objectname FROM username;

例子

以下是REVOKE命令的示例。

REVOKE INSERT,SELECT ON Employee FROM TD01;

Teradata - 用戶管理...

本章討論Teradata中性能調(diào)整的過程。

撤銷特權(quán)...

性能調(diào)整的第一步是在查詢中使用EXPLAIN。 EXPLAIN計(jì)劃提供了優(yōu)化程序如何執(zhí)行查詢的詳細(xì)信息。 在解釋計(jì)劃中,檢查關(guān)鍵字,如置信度級(jí)別,使用的連接策略,假脫機(jī)文件大小,重新分配等。

收集統(tǒng)計(jì)數(shù)據(jù)

優(yōu)化程序使用數(shù)據(jù)受眾特征來制定有效的執(zhí)行策略。 COLLECT STATISTICS命令用于收集表的數(shù)據(jù)人口統(tǒng)計(jì)。 確保在列上收集的統(tǒng)計(jì)數(shù)據(jù)是最新的。

  • 收集在WHERE子句中使用的列以及在連接條件中使用的列上的統(tǒng)計(jì)信息。

  • 收集唯一主索引列的統(tǒng)計(jì)信息。

  • 收集非唯一二級(jí)索引列的統(tǒng)計(jì)信息。 優(yōu)化器將決定是否可以使用NUSI或全表掃描。

  • 通過基表上的統(tǒng)計(jì)信息收集聯(lián)接索引的統(tǒng)計(jì)信息。

  • 收集分區(qū)列上的統(tǒng)計(jì)信息。

數(shù)據(jù)類型

確保使用正確的數(shù)據(jù)類型。 這將避免使用超過所需的過量存儲(chǔ)。

數(shù)據(jù)類型...

請(qǐng)確保連接條件中使用的列的數(shù)據(jù)類型兼容,以避免顯式數(shù)據(jù)轉(zhuǎn)換。

分類

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

分類...

如果查詢超過該用戶的每個(gè)AMP卷軸空間限制,則會(huì)生成假脫機(jī)空間錯(cuò)誤。 驗(yàn)證解釋計(jì)劃并識(shí)別占用更多假脫機(jī)空間的步驟。 這些中間查詢可以拆分并單獨(dú)放置以構(gòu)建臨時(shí)表。

主索引

確保為表正確定義了主索引。 主索引列應(yīng)均勻分布數(shù)據(jù),應(yīng)經(jīng)常用于訪問數(shù)據(jù)。

主索引...

如果定義了SET表,那么優(yōu)化器將檢查記錄是否與插入的每個(gè)記錄重復(fù)。 要?jiǎng)h除重復(fù)檢查條件,可以為表定義唯一輔助索引。

更新大表

更新大表將是耗時(shí)的。 您可以刪除記錄,并插入帶有修改行的記錄,而不是更新表。

更新大表...

刪除臨時(shí)表(臨時(shí)表)和揮發(fā)性(如果不再需要它們)。 這將釋放永久空間和假脫機(jī)空間。

MULTISET表

如果確定輸入記錄不具有重復(fù)記錄,則可以將目標(biāo)表定義為MULTISET表,以避免SET表使用重復(fù)行檢查。

Teradata - FastLoad

FastLoad實(shí)用程序用于將數(shù)據(jù)加載到空表。 由于它不使用臨時(shí)日志,因此可以快速加載數(shù)據(jù)。 即使目標(biāo)表是MULTISET表,它也不會(huì)加載重復(fù)行。

局限性

目標(biāo)表不應(yīng)該有二級(jí)索引,連接索引和外鍵引用。

MULTISET表...

FastLoad在兩個(gè)階段執(zhí)行。

階段1

  • 解析引擎從輸入文件中讀取記錄,并向每個(gè)AMP發(fā)送一個(gè)塊。

  • 每個(gè)AMP存儲(chǔ)記錄塊。

  • 然后AMP散列每個(gè)記錄,并將它們重新分配到正確的AMP。

  • 然后AMP散列每個(gè)記錄,并將它們重新分配到正確的AMP。...

階段2

  • 階段2在FastLoad接收到END LOADING語句時(shí)啟動(dòng)。

  • 每個(gè)AMP對(duì)行散列上的記錄進(jìn)行排序,并將它們寫入磁盤。

  • 釋放目標(biāo)表上的鎖,并刪除錯(cuò)誤表。

例子

釋放目標(biāo)表上的鎖,并刪除錯(cuò)誤表。...

101,Mike,James,1980-01-05,2010-03-01,1  
102,Robert,Williams,1983-03-05,2010-09-01,1 
103,Peter,Paul,1983-04-01,2009-02-12,2 
104,Alex,Stuart,1984-11-06,2014-01-01,2 
105,Robert,James,1984-12-01,2015-03-09,3

下面是一個(gè)示例FastLoad腳本將上述文件加載到Employee_Stg表中。

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;

執(zhí)行FastLoad腳本

創(chuàng)建輸入文件employee.txt并將FastLoad腳本命名為EmployeeLoad.fl后,可以在UNIX和Windows中使用以下命令運(yùn)行FastLoad腳本。

FastLoad < EmployeeLoad.fl;

一旦執(zhí)行上述命令,F(xiàn)astLoad腳本將運(yùn)行并產(chǎn)生日志。 在日志中,您可以看到FastLoad處理的記錄數(shù)和狀態(tài)代碼。

**** 03:19:14 END LOADING COMPLETE 
   Total Records Read              =  5 
   Total Error Table 1             =  0  ---- Table has been dropped 
   Total Error Table 2             =  0  ---- Table has been dropped 
   Total Inserts Applied           =  5 
   Total Duplicate Rows            =  0 
   Start:   Fri Jan  8 03:19:13 2016 
   End  :   Fri Jan  8 03:19:14 2016 
**** 03:19:14 Application Phase statistics: 
              Elapsed time: 00:00:01 (in hh:mm:ss) 
0008  LOGOFF; 
**** 03:19:15 Logging off all sessions

執(zhí)行FastLoad腳本...

以下是FastLoad腳本中使用的常用術(shù)語列表。

  • LOGON - 登錄到Teradata并啟動(dòng)一個(gè)或多個(gè)會(huì)話。

  • DATABASE - 設(shè)置默認(rèn)數(shù)據(jù)庫。

  • BEGIN LOADING - 標(biāo)識(shí)要加載的表。

  • ERRORFILES - 標(biāo)識(shí)需要?jiǎng)?chuàng)建/更新的2個(gè)錯(cuò)誤表。

  • CHECKPOINT - 定義何時(shí)采取檢查點(diǎn)。

  • SET RECORD - 指定輸入文件格式是格式化,二進(jìn)制,文本還是未格式化。

  • DEFINE - 定義輸入文件布局。

  • FILE - 指定輸入文件名和路徑。

  • INSERT - 將輸入文件中的記錄插入目標(biāo)表中。

  • INSERT - 將輸入文件中的記錄插入目標(biāo)表中。...

  • LOGOFF - 結(jié)束所有會(huì)話并終止FastLoad。

Teradata - MultiLoad

MultiLoad可以一次加載多個(gè)表,它還可以執(zhí)行不同類型的任務(wù),如INSERT,DELETE,UPDATE和UPSERT。 它一次最多可以加載5個(gè)表,并在腳本中執(zhí)行多達(dá)20個(gè)DML操作。 MultiLoad不需要目標(biāo)表。

MultiLoad支持兩種模式 -

  • IMPORT
  • DELETE

除了目標(biāo)表之外,MultiLoad還需要一個(gè)工作表,一個(gè)日志表和兩個(gè)錯(cuò)誤表。

  • 日志表 - 用于維護(hù)在加載期間采用的檢查點(diǎn),用于重新啟動(dòng)。

  • 錯(cuò)誤表 - 在發(fā)生錯(cuò)誤時(shí),在加載期間插入這些表。 第一個(gè)錯(cuò)誤表存儲(chǔ)轉(zhuǎn)換錯(cuò)誤,而第二個(gè)錯(cuò)誤表存儲(chǔ)重復(fù)記錄。

  • 日志表 - 維護(hù)MultiLoad每個(gè)階段的結(jié)果,以便重新啟動(dòng)。

  • 工作表 - MultiLoad腳本為每個(gè)目標(biāo)表創(chuàng)建一個(gè)工作表。 工作表用于保留DML任務(wù)和輸入數(shù)據(jù)。

局限性

MultiLoad有一些限制。

  • Unique Secondary Index not supported on target table.
  • Referential integrity not supported.
  • Triggers not supported.

MultiLoad如何工作

MultiLoad導(dǎo)入有五個(gè)階段 -

  • MultiLoad導(dǎo)入有五個(gè)階段 - ...

  • 階段2 - DML事務(wù)階段 - 驗(yàn)證DML語句的語法并將其帶到Teradata系統(tǒng)。

  • 階段3 - 獲取階段 - 將輸入數(shù)據(jù)置于工作表中并鎖定表。

  • 階段4 - 應(yīng)用程序階段 - 應(yīng)用所有DML操作。

  • 階段4 - 應(yīng)用程序階段 - 應(yīng)用所有DML操作。...

MultiLoad腳本中涉及的步驟是 -

  • 步驟1 - 設(shè)置日志表。

  • 步驟2 - 登錄到Teradata。

  • 步驟3 - 指定目標(biāo),工作和錯(cuò)誤表。

  • 步驟3 - 指定目標(biāo),工作和錯(cuò)誤表。...

  • 步驟5 - 定義DML查詢。

  • 步驟6 - 命名IMPORT文件。

  • 步驟7 - 指定要使用的布局。

  • 步驟8 - 啟動(dòng)加載。

  • 步驟9 - 完成加載并終止會(huì)話。

例子

創(chuàng)建具有以下記錄的文本文件,并將該文件命名為employee.txt。

101,Mike,James,1980-01-05,2010-03-01,1  
102,Robert,Williams,1983-03-05,2010-09-01,1 
103,Peter,Paul,1983-04-01,2009-02-12,2 
104,Alex,Stuart,1984-11-06,2014-01-01,2 
105,Robert,James,1984-12-01,2015-03-09,3 

以下示例是一個(gè)MultiLoad腳本,它從employee表中讀取記錄并加載到Employee_Stg表中。

.LOGTABLE tduser.Employee_log;  
.LOGON 192.168.1.102/dbc,dbc; 
   .BEGIN MLOAD TABLES Employee_Stg;  
      .LAYOUT Employee;  
      .FIELD in_EmployeeNo * VARCHAR(10);  
      .FIELD in_FirstName * VARCHAR(30); 
      .FIELD in_LastName * VARCHAR(30);  
      .FIELD in_BirthDate * VARCHAR(10); 
      .FIELD in_JoinedDate * VARCHAR(10);  
      .FIELD in_DepartmentNo * VARCHAR(02);

      .DML LABEL EmpLabel; 
      INSERT INTO Employee_Stg (
         EmployeeNo,
         FirstName,
         LastName,
         BirthDate,
         JoinedDate,
         DepartmentNo
      )  
      VALUES (
         :in_EmployeeNo,
         :in_FirstName,
         :in_Lastname,
         :in_BirthDate,
         :in_JoinedDate,
         :in_DepartmentNo
      );
      .IMPORT INFILE employee.txt  
      FORMAT VARTEXT ','
      LAYOUT Employee
      APPLY EmpLabel;  
   .END MLOAD;  
LOGOFF;

執(zhí)行MultiLoad腳本

以下示例是一個(gè)MultiLoad腳本,它從employee表中讀取記錄并加載到Employee_Stg表中。...

Multiload < EmployeeLoad.ml;

Teradata - FastExport

FastExport實(shí)用程序用于將Teradata表中的數(shù)據(jù)導(dǎo)出為平面文件。 它還可以生成報(bào)告格式的數(shù)據(jù)。 可以使用Join從一個(gè)或多個(gè)表中提取數(shù)據(jù)。 由于FastExport導(dǎo)出64K塊中的數(shù)據(jù),因此它可用于提取大量數(shù)據(jù)。

例子

考慮以下Employee表。

員工不 名字 生日
101 Mike James 1/5/1980
104 Alex Stuart 11/6/1984
102 Robert Williams 3/5/1983
105 Robert James 12/1/1984
103 Peter Paul 4/1/1983

以下是FastExport腳本的示例。 它從employee表導(dǎo)出數(shù)據(jù),并寫入文件employeedata.txt。

.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;

執(zhí)行MultiLoad腳本...

一旦腳本被編寫并命名為employee.fx,您可以使用以下命令來執(zhí)行腳本。

fexp < employee.fx

執(zhí)行上述命令后,您將在employeedata.txt文件中收到以下輸出。

103       Peter          Paul           1983-04-01 
101       Mike           James          1980-01-05 
102       Robert         Williams       1983-03-05 
105       Robert         James          1984-12-01 
104       Alex           Stuart         1984-11-06

FastExport條款

以下是FastExport腳本中常用的術(shù)語列表。

  • LOGTABLE - 指定用于重新啟動(dòng)目的的日志表。

  • LOGON - 登錄到Teradata并啟動(dòng)一個(gè)或多個(gè)會(huì)話。

  • DATABASE - 設(shè)置默認(rèn)數(shù)據(jù)庫。

  • DATABASE - 設(shè)置默認(rèn)數(shù)據(jù)庫。...

  • EXPORT - 指定目標(biāo)文件和導(dǎo)出格式。

  • SELECT - 指定要導(dǎo)出數(shù)據(jù)的選擇查詢。

  • END EXPORT - 指定FastExport的結(jié)束。

  • LOGOFF - 結(jié)束所有會(huì)話并終止FastExport。

Teradata - FastExport...

LOGOFF - 結(jié)束所有會(huì)話并終止FastExport。...

FastExport條款...

以下是BTEQ腳本中常用的術(shù)語列表。

  • LOGON - 用于登錄Teradata系統(tǒng)。

  • ACTIVITYCOUNT - 返回受上一個(gè)查詢影響的行數(shù)。

  • ERRORCODE - 返回上一個(gè)查詢的狀態(tài)代碼。

  • DATABASE - 設(shè)置默認(rèn)數(shù)據(jù)庫。

  • DATABASE - 設(shè)置默認(rèn)數(shù)據(jù)庫。...

  • RUN FILE - 執(zhí)行文件中包含的查詢。

  • GOTO - 將控制權(quán)轉(zhuǎn)移到標(biāo)簽。

  • LOGOFF - 從數(shù)據(jù)庫注銷并終止所有會(huì)話。

  • IMPORT - 指定輸入文件路徑。

  • EXPORT - 指定輸出文件路徑并啟動(dòng)導(dǎo)出。

例子

以下是BTEQ示例腳本。

.LOGON 192.168.1.102/dbc,dbc; 
   DATABASE tduser;

   CREATE TABLE employee_bkup ( 
      EmployeeNo INTEGER, 
      FirstName CHAR(30), 
      LastName CHAR(30), 
      DepartmentNo SMALLINT, 
      NetPay INTEGER 
   )
   Unique Primary Index(EmployeeNo);

   .IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;
  
   SELECT * FROM  
   Employee 
   Sample 1; 
   .IF ACTIVITYCOUNT <> 0 THEN .GOTO InsertEmployee;  

   DROP TABLE employee_bkup;
  
   .IF ERRORCODE <> 0 THEN .EXIT ERRORCODE; 
 
   .LABEL InsertEmployee 
   INSERT INTO employee_bkup 
   SELECT a.EmployeeNo, 
      a.FirstName, 
      a.LastName, 
      a.DepartmentNo, 
      b.NetPay 
   FROM  
   Employee a INNER JOIN Salary b 
   ON (a.EmployeeNo = b.EmployeeNo);  

   .IF ERRORCODE <> 0 THEN .EXIT ERRORCODE; 
.LOGOFF; 

上述腳本執(zhí)行以下任務(wù)。

  • 登錄到Teradata系統(tǒng)。

  • 設(shè)置缺省數(shù)據(jù)庫。

  • 創(chuàng)建名為employee_bkup的表。

  • 從Employee表中選擇一個(gè)記錄,以檢查表是否有任何記錄。

  • 如果表為空,則刪除employee_bkup表。

  • 如果表為空,則刪除employee_bkup表。...

  • 在每個(gè)SQL語句之后,檢查ERRORCODE以確保語句成功。

  • ACTIVITYCOUNT返回先前SQL查詢選擇/影響的記錄數(shù)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)