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歷史的快速摘要,列出了主要里程碑。
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的一些功能 -
無限并行化 - 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為VMWARE提供Teradata express,這是一個(gè)完全可操作的Teradata虛擬機(jī)。 它提供高達(dá)1 TB的存儲(chǔ)。 Teradata提供40GB和1TB版本的VMware。
由于VM是64位,因此您的CPU必須支持64位。
步驟2 - 解壓縮文件并指定目標(biāo)文件夾。
步驟3 - 從鏈接 > https://my.vmware.com/web/vmware/downloads 。 它可用于Windows和Linux。 下載適用于Windows的VMWARE工作站播放器。
步驟4 - 下載完成后,安裝軟件。
步驟5 - 安裝完成后,運(yùn)行VMWARE客戶端。
步驟6 - 選擇“打開虛擬機(jī)”。 瀏覽提取的Teradata VMWare文件夾,然后選擇擴(kuò)展名為.vmdk的文件。
步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機(jī)”。
步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機(jī)”。...
步驟9 - 以root身份輸入用戶名,按tab并以root身份輸入password,然后再次按Enter。
步驟10 - 一旦桌面上出現(xiàn)以下屏幕,雙擊“root\'s home”。 然后雙擊“Genome\'s Terminal”。 這將打開Shell。
步驟11 - 從以下shell中,輸入命令/etc/init.d/tpa start。 這將啟動(dòng)Teradata服務(wù)器。
BTEQ實(shí)用程序用于交互式提交SQL查詢。 以下是啟動(dòng)BTEQ實(shí)用程序的步驟。
步驟1 - 輸入命令/ sbin / ifconfig,記下VMWare的IP地址。
步驟2 - 運(yùn)行命令bteq。 在登錄提示符處,輸入命令。
登錄< ip address> / dbc,dbc; 并在密碼提示符下輸入password as dbc;
您可以使用BTEQ登錄Teradata系統(tǒng)并運(yùn)行任何SQL查詢。
Teradata架構(gòu)基于大規(guī)模并行處理(MPP)架構(gòu)。 Teradata的主要組件是解析引擎,BYNET和訪問模塊處理器(AMP)。 下圖顯示了Teradata節(jié)點(diǎn)的高級(jí)架構(gòu)。
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ù)。
當(dāng)客戶端運(yùn)行查詢以插入記錄時(shí),解析引擎將記錄發(fā)送到BYNET。 BYNET檢索記錄并將該行發(fā)送到目標(biāo)AMP。 AMP將這些記錄存儲(chǔ)在其磁盤上。 下圖顯示了Teradata的存儲(chǔ)體系結(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)。
關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)是一種DBMS軟件,有助于與數(shù)據(jù)庫進(jìn)行交互。 它們使用結(jié)構(gòu)化查詢語言(SQL)與存儲(chǔ)在表中的數(shù)據(jù)進(jìn)行交互。
數(shù)據(jù)庫是邏輯相關(guān)數(shù)據(jù)的集合。 它們被許多用戶訪問用于不同的目的。 例如,銷售數(shù)據(jù)庫包含有關(guān)存儲(chǔ)在許多表中的銷售的全部信息。
表是存儲(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 |
主鍵用于唯一標(biāo)識(shí)表中的行。 主鍵列中不允許有重復(fù)值,它們不能接受NULL值。 它是表中的必填字段。
外鍵用于建立表之間的關(guān)系。 子表中的外鍵被定義為父表中的主鍵。 一個(gè)表可以有多個(gè)外鍵。 它可以接受重復(fù)值和空值。 外鍵在表中是可選的。
表中的每個(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 |
關(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)建,使用和丟棄它們的查詢中。
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命令用于刪除表。 |
本章介紹用于操作存儲(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 |
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表中。
在VALUES列表中指定的列數(shù)應(yīng)該與INSERT INTO子句中指定的列匹配。
NOT NULL列的值是必需的。
如果未指定值,則為可空字段插入NULL。
在VALUES子句中指定的列的數(shù)據(jù)類型應(yīng)與INSERT子句中的列的數(shù)據(jù)類型兼容。
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
您可以更新表的一個(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.
您可以更新表的一個(gè)或多個(gè)記錄。
如果未指定WHERE條件,則表的所有行都將被刪除。
您可以使用另一個(gè)表中的值更新表。
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子句用于過濾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
執(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支持以下邏輯和條件運(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
SET運(yùn)算符合并多個(gè)SELECT語句的結(jié)果。 這可能看起來類似于連接,但連接組合來自多個(gè)表的列,而SET運(yùn)算符組合來自多個(gè)行的行。
每個(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類似,它合并來自多個(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
當(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命令組合多個(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提供了幾個(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í)間功能。
日期使用以下公式在內(nèi)部存儲(chǔ)為整數(shù)。
((YEAR - 1900) * 10000) + (MONTH * 100) + 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ù)。
以下示例將3年添加到當(dāng)前日期。
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03' YEAR; Date (Date+ 3) -------- --------- 16/01/01 19/01/01
以下示例將3年和01個(gè)月添加到當(dāng)前日期。
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03-01' YEAR TO MONTH; Date (Date+ 3-01) -------- ------------ 16/01/01 19/02/01
以下示例將01天,05小時(shí)和10分鐘添加到當(dāng)前時(shí)間戳。
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
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ù)。 它們可以與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ì)算Salary表中的記錄數(shù)。
SELECT count(*) from Salary; Count(*) ----------- 5
以下示例返回最大員工凈工資值。
SELECT max(NetPay) from Salary; Maximum(NetPay) --------------------- 83000
以下示例從薪金表中返回最低雇員凈薪值。
SELECT min(NetPay) from Salary; Minimum(NetPay) --------------------- 36000
以下示例返回表中的員工凈薪值的平均值。
SELECT avg(NetPay) from Salary; Average(NetPay) --------------------- 65800
以下示例計(jì)算員工薪金表中所有記錄的凈工資總和。
SELECT sum(NetPay) from Salary; Sum(NetPay) ----------------- 329000
本章介紹Teradata的CASE和COALESCE函數(shù)。
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;
如果參數(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
主索引用于指定數(shù)據(jù)駐留在Teradata中的位置。 它用于指定哪個(gè)AMP獲取數(shù)據(jù)行。 Teradata中的每個(gè)表都需要定義主索引。 如果未定義主索引,Teradata會(huì)自動(dòng)分配主索引。 主索引提供了訪問數(shù)據(jù)的最快方式。 主要最多可以有64列。
在創(chuàng)建表時(shí)定義主索引。 有兩種類型的主索引。
如果表被定義為具有UPI,則被認(rèn)為是UPI的列不應(yīng)該具有任何重復(fù)值。 如果插入任何重復(fù)值,它們將被拒絕。
以下示例使用列EmployeeNo作為唯一主索引創(chuàng)建了“薪金”表。
CREATE SET TABLE Salary ( EmployeeNo INTEGER, Gross INTEGER, Deduction INTEGER, NetPay INTEGER ) UNIQUE PRIMARY INDEX(EmployeeNo);
如果表被定義為具有NUPI,則被視為UPI的列可以接受重復(fù)值。
以下示例創(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);
聯(lián)接用于組合來自多個(gè)表的記錄。 基于來自這些表的公共列/值來連接表。
有不同類型的聯(lián)接可用。
內(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語句的語法。
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
子查詢基于另一個(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支持以下表類型來保存臨時(shí)數(shù)據(jù)。
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
在用戶會(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í)表的定義存儲(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中有三種類型的空格可用。...
不為數(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ù)量。
表只能包含一個(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è)新行更新子表。
有兩種類型的輔助索引 -
唯一輔助索引只允許定義為USI的列的唯一值。 通過USI訪問該行是一個(gè)雙放大操作。
以下示例在Employee表的EmployeeNo列上創(chuàng)建USI。
CREATE UNIQUE INDEX(EmployeeNo) on employee;
非唯一二級(jí)索引允許定義為NUSI的列的重復(fù)值。 通過NUSI訪問該行是全放大器操作。
以下示例在employee表的FirstName列上創(chuàng)建NUSI。
CREATE INDEX(FirstName) on Employee;
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í)行策略。
有三種方法來收集表上的統(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.
您可以使用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
壓縮用于減少表所使用的存儲(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)建表之后添加壓縮。
下表壓縮值為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í),可以使用多值壓縮。
EXPLAIN命令以英語返回解析引擎的執(zhí)行計(jì)劃。 它可以與除另一個(gè)EXPLAIN命令之外的任何SQL語句一起使用。 當(dāng)查詢前面有EXPLAIN命令時(shí),解析引擎的執(zhí)行計(jì)劃將返回給用戶,而不是AMP。
考慮具有以下定義的表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ì)劃的一些示例。
當(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.
當(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)...
基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個(gè)AMP獲取行。
基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個(gè)AMP獲取行。...
以下是插入數(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)行邏輯排序。
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 |
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ù)。 連接索引主要用于提高性能。...
單表聯(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。...
如果表在某些列上始終聚合,則可以在表上定義聚合連接索引以提高性能。 聚合連接索引的一個(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);
視圖是由查詢構(gòu)建的數(shù)據(jù)庫對(duì)象。 可以使用單個(gè)表或通過連接的多個(gè)表來構(gòu)建視圖。 它們的定義永久存儲(chǔ)在數(shù)據(jù)字典中,但它們不存儲(chǔ)數(shù)據(jù)的副本。 視圖的數(shù)據(jù)是動(dòng)態(tài)構(gòu)建的。
視圖可以包含表的行的子集或表的列的子集。
視圖是使用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;
下面是一個(gè)刪除視圖Employee_View的示例。...
用戶只能訪問視圖而不是基表。
用戶只能訪問視圖而不是基表。...
宏是一組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è)語句。
宏是一組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; );
下面的示例創(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
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; );
宏使用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
存儲(chǔ)過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲(chǔ)過程的定義存儲(chǔ)在數(shù)據(jù)庫中,參數(shù)存儲(chǔ)在數(shù)據(jù)字典表中。
存儲(chǔ)過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲(chǔ)過程的定義存儲(chǔ)在數(shù)據(jù)庫中,參數(shù)存儲(chǔ)在數(shù)據(jù)字典表中。...
提供更好的安全性,因?yàn)橥ㄟ^存儲(chǔ)過程訪問數(shù)據(jù),而不是直接訪問它們。
提供更好的安全性,因?yàn)橥ㄟ^存儲(chǔ)過程訪問數(shù)據(jù),而不是直接訪問它們。...
存儲(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;
存儲(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 |
執(zhí)行上述查詢后,它將生成以下輸出,您可以在Salary表中看到插入的行。...
Teradata使用不同的連接方法來執(zhí)行連接操作。 一些常用的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è)表的主索引。
當(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表。
如果這兩個(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è)表上的任何索引。...
Product Join將來自一個(gè)表的每個(gè)限定行與來自其他表的每個(gè)限定行進(jìn)行比較。 產(chǎn)品加入可能由于以下某些因素而發(fā)生:
分區(qū)主索引(PPI)是一種索引機(jī)制,可用于提高某些查詢的性能。 當(dāng)將行插入到表中時(shí),它們存儲(chǔ)在AMP中并按其行散列順序排列。 當(dāng)使用PPI定義表時(shí),行按其分區(qū)編號(hào)排序。 在每個(gè)分區(qū)中,它們按其行散列排列。 根據(jù)定義的分區(qū)表達(dá)式將行分配給分區(qū)。
避免對(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中,基于它們的行哈希排序。
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 |
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ū)。...
劃分 | 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 |
劃分 | 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ū)。
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使用瞬態(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中。
當(dāng)AMP故障并且表受回退保護(hù)時(shí),將激活Down AMP恢復(fù)日志。 此日志記錄對(duì)失敗的AMP的數(shù)據(jù)的所有更改。 在集群中剩余的AMP上激活日志。 這是一個(gè)自動(dòng)過程,不能禁用。 一旦失敗的AMP生效,則來自下行AMP恢復(fù)日志的數(shù)據(jù)與AMP同步。 一旦完成,日志將被丟棄。
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ù)訪問其磁盤陣列。
熱備節(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ù)。
本章討論了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;
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中性能調(diào)整的過程。
性能調(diào)整的第一步是在查詢中使用EXPLAIN。 EXPLAIN計(jì)劃提供了優(yōu)化程序如何執(zhí)行查詢的詳細(xì)信息。 在解釋計(jì)劃中,檢查關(guān)鍵字,如置信度級(jí)別,使用的連接策略,假脫機(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ù)類型。 這將避免使用超過所需的過量存儲(chǔ)。
請(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ī)空間。
如果確定輸入記錄不具有重復(fù)記錄,則可以將目標(biāo)表定義為MULTISET表,以避免SET表使用重復(fù)行檢查。
FastLoad實(shí)用程序用于將數(shù)據(jù)加載到空表。 由于它不使用臨時(shí)日志,因此可以快速加載數(shù)據(jù)。 即使目標(biāo)表是MULTISET表,它也不會(huì)加載重復(fù)行。
目標(biāo)表不應(yīng)該有二級(jí)索引,連接索引和外鍵引用。
FastLoad在兩個(gè)階段執(zhí)行。
解析引擎從輸入文件中讀取記錄,并向每個(gè)AMP發(fā)送一個(gè)塊。
每個(gè)AMP存儲(chǔ)記錄塊。
然后AMP散列每個(gè)記錄,并將它們重新分配到正確的AMP。
然后AMP散列每個(gè)記錄,并將它們重新分配到正確的AMP。...
階段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;
創(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
以下是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。
MultiLoad可以一次加載多個(gè)表,它還可以執(zhí)行不同類型的任務(wù),如INSERT,DELETE,UPDATE和UPSERT。 它一次最多可以加載5個(gè)表,并在腳本中執(zhí)行多達(dá)20個(gè)DML操作。 MultiLoad不需要目標(biāo)表。
MultiLoad支持兩種模式 -
除了目標(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有一些限制。
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;
以下示例是一個(gè)MultiLoad腳本,它從employee表中讀取記錄并加載到Employee_Stg表中。...
Multiload < EmployeeLoad.ml;
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;
一旦腳本被編寫并命名為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腳本中常用的術(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。
LOGOFF - 結(jié)束所有會(huì)話并終止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ù)。
更多建議: