Teradata是受歡迎的關系數(shù)據(jù)庫管理系統(tǒng)之一。 它主要適用于構建大規(guī)模數(shù)據(jù)倉庫應用程序。 Teradata通過并行性的概念實現(xiàn)了這一點。 它是由Teradata公司開發(fā)的。
以下是Teradata歷史的快速摘要,列出了主要里程碑。
1979 - 并入Teradata。
1984 - 發(fā)布第一個數(shù)據(jù)庫計算機DBC / 1012。
1986 - 財富雜志將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 - 收購Teradata Aster并進入高級分析空間。
2012 - 推出Teradata 14.0。
2014 - 推出Teradata 15.0。
以下是Teradata的一些功能 -
無限并行化 - Teradata數(shù)據(jù)庫系統(tǒng)基于大規(guī)模并行處理(MPP)架構。 MPP架構在整個系統(tǒng)上平均分配負載。 Teradata系統(tǒng)在其進程之間分割任務,并并行運行它們以確保任務快速完成。
沒有共享架構 - Teradata的架構稱為共享無架構。 Teradata節(jié)點,其訪問模塊處理器(AMP)和與AMP相關聯(lián)的磁盤獨立工作。 他們不會與他人分享。
線性可擴展性 - Teradata系統(tǒng)具有高度可擴展性。 它們可以擴展到2048個節(jié)點。 例如,通過將AMP的數(shù)量加倍,可以使系統(tǒng)的容量增加一倍。
連接 - Teradata可連接到通道連接的系統(tǒng),如主機或網(wǎng)絡連接的系統(tǒng)。
成熟優(yōu)化程序 - Teradata優(yōu)化程序是市場上成熟的優(yōu)化程序之一。 它自從開始就被設計為平行的。 它已經(jīng)針對每個版本進行了優(yōu)化。
SQL - Teradata支持行業(yè)標準SQL與存儲在表中的數(shù)據(jù)進行交互。 除此之外,它提供自己的擴展。
強大的實用工具 - Teradata提供強大的實用程序,用于從/向Teradata系統(tǒng)導入/導出數(shù)據(jù),例如FastLoad,MultiLoad,F(xiàn)astExport和TPT。
自動分發(fā) - Teradata自動將數(shù)據(jù)均勻分發(fā)到磁盤,而無需任何手動干預。
Teradata為VMWARE提供Teradata express,這是一個完全可操作的Teradata虛擬機。 它提供高達1 TB的存儲。 Teradata提供40GB和1TB版本的VMware。
由于VM是64位,因此您的CPU必須支持64位。
步驟2 - 解壓縮文件并指定目標文件夾。
步驟3 - 從鏈接 > https://my.vmware.com/web/vmware/downloads 。 它可用于Windows和Linux。 下載適用于Windows的VMWARE工作站播放器。
步驟4 - 下載完成后,安裝軟件。
步驟5 - 安裝完成后,運行VMWARE客戶端。
步驟6 - 選擇“打開虛擬機”。 瀏覽提取的Teradata VMWare文件夾,然后選擇擴展名為.vmdk的文件。
步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機”。
步驟7 - Teradata VMWare已添加到VMWare客戶端。 選擇添加的Teradata VMware,然后單擊“播放虛擬機”。...
步驟9 - 以root身份輸入用戶名,按tab并以root身份輸入password,然后再次按Enter。
步驟10 - 一旦桌面上出現(xiàn)以下屏幕,雙擊“root\'s home”。 然后雙擊“Genome\'s Terminal”。 這將打開Shell。
步驟11 - 從以下shell中,輸入命令/etc/init.d/tpa start。 這將啟動Teradata服務器。
BTEQ實用程序用于交互式提交SQL查詢。 以下是啟動BTEQ實用程序的步驟。
步驟1 - 輸入命令/ sbin / ifconfig,記下VMWare的IP地址。
步驟2 - 運行命令bteq。 在登錄提示符處,輸入命令。
登錄< ip address> / dbc,dbc; 并在密碼提示符下輸入password as dbc;
您可以使用BTEQ登錄Teradata系統(tǒng)并運行任何SQL查詢。
Teradata架構基于大規(guī)模并行處理(MPP)架構。 Teradata的主要組件是解析引擎,BYNET和訪問模塊處理器(AMP)。 下圖顯示了Teradata節(jié)點的高級架構。
Teradata的關鍵組件如下 -
節(jié)點 - 它是Teradata系統(tǒng)中的基本單元。 Teradata系統(tǒng)中的每個單獨的服務器都稱為節(jié)點。 節(jié)點由自己的操作系統(tǒng),CPU,內(nèi)存,自己的Teradata RDBMS軟件副本和磁盤空間組成。 機柜由一個或多個節(jié)點組成。
解析引擎 - 解析引擎負責從客戶端接收查詢并準備有效的執(zhí)行計劃。 解析引擎的職責是 -
從客戶端接收SQL查詢
解析SQL查詢檢查語法錯誤
檢查用戶是否具有針對SQL查詢中使用的對象的所需特權
檢查在SQL中使用的對象是否確實存在
準備執(zhí)行計劃以執(zhí)行SQL查詢并將其傳遞給BYNET
從AMP接收結果并發(fā)送到客戶端
消息傳遞層 - 消息傳遞層稱為BYNET,是Teradata系統(tǒng)中的網(wǎng)絡層。 它允許PE和AMP之間以及節(jié)點之間的通信。 它從解析引擎接收執(zhí)行計劃并發(fā)送到AMP。 類似地,它從AMP接收結果并發(fā)送到解析引擎。
訪問模塊處理器(AMP) - 稱為虛擬處理器(vprocs)的AMP是實際存儲和檢索數(shù)據(jù)的AMP。 AMP從解析引擎接收數(shù)據(jù)和執(zhí)行計劃,執(zhí)行任何數(shù)據(jù)類型轉換,聚合,過濾,排序并將數(shù)據(jù)存儲在與其關聯(lián)的磁盤中。 表中的記錄均勻分布在系統(tǒng)中的AMP之間。 每個AMP與存儲數(shù)據(jù)的一組磁盤相關聯(lián)。 只有該AMP可以從磁盤讀取/寫入數(shù)據(jù)。
當客戶端運行查詢以插入記錄時,解析引擎將記錄發(fā)送到BYNET。 BYNET檢索記錄并將該行發(fā)送到目標AMP。 AMP將這些記錄存儲在其磁盤上。 下圖顯示了Teradata的存儲體系結構。
當客戶端運行查詢以檢索記錄時,解析引擎會向BYNET發(fā)送請求。 BYNET將檢索請求發(fā)送到適當?shù)腁MP。 然后AMPs并行搜索其磁盤并識別所需的記錄并發(fā)送到BYNET。 BYNET然后將記錄發(fā)送到解析引擎,解析引擎又將發(fā)送到客戶端。 以下是Teradata的檢索體系結構。
關系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)是一種DBMS軟件,有助于與數(shù)據(jù)庫進行交互。 它們使用結構化查詢語言(SQL)與存儲在表中的數(shù)據(jù)進行交互。
數(shù)據(jù)庫是邏輯相關數(shù)據(jù)的集合。 它們被許多用戶訪問用于不同的目的。 例如,銷售數(shù)據(jù)庫包含有關存儲在許多表中的銷售的全部信息。
表是存儲數(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 |
行是所有列的一個實例。 例如,在員工表中,一行包含有關單個員工的信息。
員工不 | 名字 | 姓 | 生日 |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
主鍵用于唯一標識表中的行。 主鍵列中不允許有重復值,它們不能接受NULL值。 它是表中的必填字段。
外鍵用于建立表之間的關系。 子表中的外鍵被定義為父表中的主鍵。 一個表可以有多個外鍵。 它可以接受重復值和空值。 外鍵在表中是可選的。
表中的每個列都與數(shù)據(jù)類型相關聯(lián)。 數(shù)據(jù)類型指定將在列中存儲什么類型的值。 Teradata支持多種數(shù)據(jù)類型。 以下是一些常用的數(shù)據(jù)類型。
數(shù)據(jù)類型 | 長度(字節(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 |
關系模型中的表定義為數(shù)據(jù)集合。 它們表示為行和列。
類型Teradata支持不同類型的表。
永久表 - 這是默認表,它包含用戶插入的數(shù)據(jù),并永久存儲數(shù)據(jù)。
易失性表 - 插入到易失性表中的數(shù)據(jù)僅在用戶會話期間保留。 在會話結束時刪除表和數(shù)據(jù)。 這些表主要用于在數(shù)據(jù)變換期間保存中間數(shù)據(jù)。
全局臨時表 - 全局臨時表的定義是持久的,但是在用戶會話結束時刪除表中的數(shù)據(jù)。
派生表 - 派生表保存查詢中的中間結果。 它們的生命周期在創(chuàng)建,使用和丟棄它們的查詢中。
Teradata基于如何處理重復記錄將表分類為SET或MULTISET表。 定義為SET表的表不存儲重復記錄,而MULTISET表可存儲重復記錄。
值的范圍... | 表命令& 描述 |
---|---|
1 |
Create Table
CREATE TABLE命令用于在Teradata中創(chuàng)建表。 |
2 |
Alter Table
ALTER TABLE命令用于從現(xiàn)有表中添加或刪除列。 |
3 |
Drop Table
DROP TABLE命令用于刪除表。 |
本章介紹用于操作存儲在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語句用于從另一個表插入記錄。
以下是INSERT INTO的通用語法。
INSERT INTO <tablename> (column1, column2, column3,…) SELECT column1, column2, column3… FROM <source table>;
以下示例將記錄插入到員工表中。 在運行以下插入查詢之前,創(chuàng)建具有與employee表相同的列定義的名為Employee_Bkup的表。
INSERT INTO Employee_Bkup ( EmployeeNo, FirstName, LastName, BirthDate, JoinedDate, DepartmentNo ) SELECT EmployeeNo, FirstName, LastName, BirthDate, JoinedDate, DepartmentNo FROM Employee;
當執(zhí)行上述查詢時,它將把employee表中的所有記錄插入到employee_bkup表中。
在VALUES列表中指定的列數(shù)應該與INSERT INTO子句中指定的列匹配。
NOT NULL列的值是必需的。
如果未指定值,則為可空字段插入NULL。
在VALUES子句中指定的列的數(shù)據(jù)類型應與INSERT子句中的列的數(shù)據(jù)類型兼容。
UPDATE語句用于更新表中的記錄。
以下是UPDATE的通用語法。
UPDATE <tablename> SET <columnnamme> = <new value> [WHERE condition];
以下示例將員工部門更新為03(對于員工101)。
UPDATE Employee SET DepartmentNo = 03 WHERE EmployeeNo = 101;
在以下輸出中,您可以看到對于員工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
您可以更新表的一個或多個值。
如果未指定WHERE條件,則表的所有行都受到影響。
您可以使用另一個表中的值更新表。
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.
您可以更新表的一個或多個記錄。
如果未指定WHERE條件,則表的所有行都將被刪除。
您可以使用另一個表中的值更新表。
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í)行此查詢時,它從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子句相關聯(lián)。 僅返回滿足WHERE子句中的條件的記錄。
以下是具有WHERE子句的SELECT語句的語法。
SELECT * FROM tablename WHERE[condition];
以下查詢獲取EmployeeNo為101的記錄。
SELECT * FROM Employee WHERE EmployeeNo = 101;
執(zhí)行此查詢時,它返回以下記錄。
EmployeeNo FirstName LastName ----------- ------------------------------ ----------------------------- 101 Mike James
執(zhí)行SELECT語句時,返回的行不按任何特定順序。 ORDER BY子句用于按任何列升序/降序排列記錄。
以下是帶有ORDER BY子句的SELECT語句的語法。
SELECT * FROM tablename ORDER BY column 1, column 2..;
以下查詢從employee表中提取記錄,并按FirstName對結果排序。
SELECT * FROM Employee ORDER BY FirstName;
當執(zhí)行上述查詢時,它將產(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列對記錄進行分組,并標識每個部門的總計數(shù)。
SELECT DepartmentNo,Count(*) FROM Employee GROUP BY DepartmentNo;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。
DepartmentNo Count(*) ------------ ----------- 3 1 1 1 2 3
Teradata支持以下邏輯和條件運算符。 這些運算符用于執(zhí)行比較和組合多個條件。
生日... | 含義 |
---|---|
> | 比...更棒 |
< | 少于 |
>= | 大于或等于 |
<= | 小于或等于 |
= | 等于 |
BETWEEN | 如果值在范圍內(nèi) |
IN | 如果&lt;表達式&gt; |
未輸入 | 未輸入... |
IS NULL | IS NULL ... |
IS NOT NULL | IS NOT NULL ... |
AND | 組合多個條件。 僅當滿足所有條件時,才評估為true |
OR | 組合多個條件。 如果滿足任一條件,則計算為true。 |
NOT | 反轉條件的含義 |
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 |
以下示例獲取員工編號介于101,102和103之間范圍內(nèi)的記錄。
SELECT EmployeeNo, FirstName FROM Employee WHERE EmployeeNo BETWEEN 101 AND 103;
當執(zhí)行上述查詢時,它返回雇員記錄,員工編號在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ù)給定的值列表檢查值。
以下示例獲取員工編號為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命令反轉IN命令的結果。 它獲取的值與給定列表不匹配的記錄。
以下示例獲取員工編號不在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運算符合并多個SELECT語句的結果。 這可能看起來類似于連接,但連接組合來自多個表的列,而SET運算符組合來自多個行的行。
每個SELECT語句的列數(shù)應該相同。
每個SELECT的數(shù)據(jù)類型必須兼容。
ORDER BY應該只包含在最終的SELECT語句中。
UNION語句用于組合多個SELECT語句的結果。 它忽略重復。
下面是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í)行查詢時,將生成以下輸出。
EmployeeNo ----------- 101 102 103 104 105
UNION ALL語句與UNION類似,它合并來自多個表(包括重復行)的結果。
以下是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;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。 你可以看到它也返回重復。
EmployeeNo ----------- 101 104 102 105 103 101 104 102 103
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。 你可以看到它也返回重復。...
以下是INTERSECT語句的基本語法。
SELECT col1, col2, col3… FROM <table 1> [WHERE condition] INTERSECT SELECT col1, col2, col3… FROM <table 2> [WHERE condition];
以下是INTERSECT語句的示例。 它返回兩個表中存在的EmployeeNo值。
SELECT EmployeeNo FROM Employee INTERSECT SELECT EmployeeNo FROM Salary;
當執(zhí)行上述查詢時,它返回以下記錄。 EmployeeNo 105被排除,因為它不存在于SALARY表中。
EmployeeNo ----------- 101 104 102 103
MINUS / EXCEPT命令組合多個表中的行,并返回第一個SELECT但不包含第二個SELECT的行。 它們都返回相同的結果。
以下是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í)行此查詢時,它返回以下記錄。
EmployeeNo ----------- 105
Teradata提供了幾個函數(shù)來操作字符串。 這些功能與ANSI標準兼容。
NetPay... | 字符串函數(shù)&amp; 描述 |
---|---|
1 |
||
將字符串連接在一起 |
2 |
SUBSTR
提取字符串的一部分(Teradata擴展) |
3 |
SUBSTRING
提取字符串的一部分(ANSI標準) |
4 |
INDEX
查找字符在字符串中的位置(Teradata擴展) |
5 |
POSITION
定位字符在字符串中的位置(ANSI標準) |
6 |
TRIM
修剪字符串中的空格 |
7 |
UPPER
將字符串轉換為大寫 |
8 |
LOWER
將字符串轉換為小寫 |
下表列出了一些帶有結果的字符串函數(shù)。
字符串函數(shù)&amp; 描述... | 結果 |
---|---|
SELECT SUBSTRING(\'warehouse\'FROM 1 FOR 4) | Ware |
SELECT SUBSTR(\'warehouse\',1,4) | Ware |
SELECT\'data\'|| \'\'|| \'倉庫\' | SELECT\'data\'|| \'\'|| \'倉庫\'... |
SELECT UPPER(\'data\') | DATA |
SELECT LOWER(\'DATA\') | Data |
本章討論Teradata中可用的日期/時間功能。
日期使用以下公式在內(nèi)部存儲為整數(shù)。
((YEAR - 1900) * 10000) + (MONTH * 100) + DAY
您可以使用以下查詢來檢查日期的存儲方式。
SELECT CAST(CURRENT_DATE AS INTEGER);
由于日期存儲為整數(shù),您可以對它們執(zhí)行一些算術運算。 Teradata提供執(zhí)行這些操作的函數(shù)。
EXTRACT函數(shù)從DATE值提取日,月和年的部分。 此功能還用于從TIME / TIMESTAMP值提取小時,分鐘和秒。
以下示例顯示如何從日期和時間戳值提取年,月,日期,小時,分鐘和秒值。
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ù)以對DATE和TIME值執(zhí)行算術運算。 有兩種類型的INTERVAL函數(shù)。
以下示例將3年添加到當前日期。
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03' YEAR; Date (Date+ 3) -------- --------- 16/01/01 19/01/01
以下示例將3年和01個月添加到當前日期。
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03-01' YEAR TO MONTH; Date (Date+ 3-01) -------- ------------ 16/01/01 19/02/01
以下示例將01天,05小時和10分鐘添加到當前時間戳。
SELECT CURRENT_TIMESTAMP,CURRENT_TIMESTAMP + INTERVAL '01 05:10' DAY TO MINUTE; Current TimeStamp(6) (Current TimeStamp(6)+ 1 05:10) -------------------------------- -------------------------------- 2016-01-01 04:57:26.360000+00:00 2016-01-02 10:07:26.360000+00:00
Teradata提供了內(nèi)置函數(shù),這些函數(shù)是SQL的擴展。 以下是常見的內(nèi)置函數(shù)。
功能 | 結果 |
---|---|
SELECT DATE; |
日期 -------- 16/01/01 |
SELECT CURRENT_DATE; |
日期 -------- 16/01/01 |
選擇時間; | Time -------- 04:50:29 |
SELECT CURRENT_TIME; |
時間 -------- 04:50:29 |
SELECT CURRENT_TIMESTAMP; |
當前時間戳(6) -------------------------------- 2016-01-01 04: 51:06.990000&amp; plus; 00:00 |
當前時間戳(6) -------------------------------- 2016-01-01 04: 51:06.990000&amp; plus; 00:00... |
Database ------------------------------ TDUSER |
Teradata支持公共聚合函數(shù)。 它們可以與SELECT語句一起使用。
COUNT - 計算行數(shù)
SUM - 累計指定列的值
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 |
以下示例計算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
以下示例計算員工薪金表中所有記錄的凈工資總和。
SELECT sum(NetPay) from Salary; Sum(NetPay) ----------------- 329000
本章介紹Teradata的CASE和COALESCE函數(shù)。
CASE表達式根據(jù)條件或WHEN子句計算每一行,并返回第一個匹配的結果。 如果沒有匹配,則返回ELSE部分的結果。
以下是CASE表達式的語法。
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 |
以下示例計算DepartmentNo列,如果部門號為1,則返回值1; 如果部門號碼為3,則返回2; 否則返回值作為無效部門。
SELECT EmployeeNo, CASE DepartmentNo WHEN 1 THEN 'Admin' WHEN 2 THEN 'IT' ELSE 'Invalid Dept' END AS Department FROM Employee;
當執(zhí)行上述查詢時,它將產(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表達式也可以以下面的形式寫出,這將產(chǎn)生與上面相同的結果。
SELECT EmployeeNo, CASE WHEN DepartmentNo = 1 THEN 'Admin' WHEN DepartmentNo = 2 THEN 'IT' ELSE 'Invalid Dept' END AS Department FROM Employee;
COALESCE是返回表達式的第一個非空值的語句。 如果表達式的所有參數(shù)計算結果為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有部門號。 作為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中的位置。 它用于指定哪個AMP獲取數(shù)據(jù)行。 Teradata中的每個表都需要定義主索引。 如果未定義主索引,Teradata會自動分配主索引。 主索引提供了訪問數(shù)據(jù)的最快方式。 主要最多可以有64列。
在創(chuàng)建表時定義主索引。 有兩種類型的主索引。
如果表被定義為具有UPI,則被認為是UPI的列不應該具有任何重復值。 如果插入任何重復值,它們將被拒絕。
以下示例使用列EmployeeNo作為唯一主索引創(chuàng)建了“薪金”表。
CREATE SET TABLE Salary ( EmployeeNo INTEGER, Gross INTEGER, Deduction INTEGER, NetPay INTEGER ) UNIQUE PRIMARY INDEX(EmployeeNo);
如果表被定義為具有NUPI,則被視為UPI的列可以接受重復值。
以下示例創(chuàng)建了將EmployeeNo列作為非唯一主索引的員工帳戶表。 EmployeeNo被定義為非唯一主索引,因為員工在表中可以有多個帳戶; 一個用于薪金帳戶,另一個用于報銷帳戶。
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)接用于組合來自多個表的記錄。 基于來自這些表的公共列/值來連接表。
有不同類型的聯(lián)接可用。
內(nèi)連接組合來自多個表的記錄,并返回兩個表中存在的值。
以下是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表。 每個表被分配一個別名A&amp; B和列使用正確的別名引用。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay FROM Employee A INNER JOIN Salary B ON (A.EmployeeNo = B. EmployeeNo);
當執(zhí)行上述查詢時,它返回以下記錄。 員工105不包括在結果中,因為它在薪金表中沒有匹配的記錄。
*** 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也合并了多個表的結果。
LEFT OUTER JOIN和RIGHT OUTER JOIN也合并了多個表的結果。...
RIGHT OUTER JOIN 返回右表中的所有記錄,并僅返回左表中匹配的行。
FULL OUTER JOIN 結合了LEFT OUTER和RIGHT OUTER JOINS的結果。 它從連接的表返回匹配和不匹配的行。
以下是OUTER JOIN語句的語法。 您需要使用LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL OUTER JOIN中的一個選項。
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中的一個選項。...
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay FROM Employee A LEFT OUTER JOIN Salary B ON (A.EmployeeNo = B. EmployeeNo) ORDER BY A.EmployeeNo;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。 對于員工105,NetPay值為NULL,因為它在薪金表中沒有匹配的記錄。
*** 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
子查詢基于另一個表中的值從一個表返回記錄。 它是另一個查詢中的SELECT查詢。 作為內(nèi)部查詢調(diào)用的SELECT查詢將首先執(zhí)行,結果將由外部查詢使用。 它的一些突出特點是 -
子查詢基于另一個表中的值從一個表返回記錄。 它是另一個查詢中的SELECT查詢。 作為內(nèi)部查詢調(diào)用的SELECT查詢將首先執(zhí)行,結果將由外部查詢使用。 它的一些突出特點是 - ...
子查詢不返回重復記錄。
子查詢不返回重復記錄。...
以下是子查詢的通用語法。
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 |
以下查詢標識最高薪水的員工編號。 內(nèi)部SELECT執(zhí)行聚合函數(shù)以返回最大NetPay值,外部SELECT查詢使用此值返回具有此值的雇員記錄。
SELECT EmployeeNo, NetPay FROM Salary WHERE NetPay = (SELECT MAX(NetPay) FROM Salary);
執(zhí)行此查詢時,將生成以下輸出。
*** Query completed. One row found. 2 columns returned. *** Total elapsed time was 1 second. EmployeeNo NetPay ----------- ----------- 103 83000
Teradata支持以下表類型來保存臨時數(shù)據(jù)。
Teradata支持以下表類型來保存臨時數(shù)據(jù)。...
以下示例構建具有薪金大于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;
以下示例構建具有薪金大于75000的員工的記錄的派生表EmpSal。...
*** Query completed. One row found. 3 columns returned. *** Total elapsed time was 1 second. EmployeeNo FirstName NetPay ----------- ------------------------------ ----------- 103 Peter 83000
在用戶會話中創(chuàng)建,使用和刪除易失性表。 它們的定義不存儲在數(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;
在用戶會話中創(chuàng)建,使用和刪除易失性表。 它們的定義不存儲在數(shù)據(jù)字典中。 它們保存經(jīng)常使用的查詢的中間數(shù)據(jù)。 以下是語法。...
*** Table has been created. *** Total elapsed time was 1 second.
全局臨時表的定義存儲在數(shù)據(jù)字典中,并且它們可以被許多用戶/會話使用。 但是加載到全局臨時表中的數(shù)據(jù)僅在會話期間保留。 每個會話最多可以實現(xiàn)2000個全局臨時表。 以下是語法。
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ù)據(jù)字典中,并且它們可以被許多用戶/會話使用。 但是加載到全局臨時表中的數(shù)據(jù)僅在會話期間保留。 每個會話最多可以實現(xiàn)2000個全局臨時表。 以下是語法。...
*** Table has been created. *** Total elapsed time was 1 second.
Teradata中有三種類型的空格可用。
Teradata中有三種類型的空格可用。...
不為數(shù)據(jù)庫/用戶預分配永久空間。 它們只是定義為數(shù)據(jù)庫/用戶可以使用的最大空間量。 永久空間的量除以AMP的數(shù)量。 每當每個AMP限制超過,將生成一條錯誤消息。
假脫機空間是未使用的永久空間,由系統(tǒng)用于保留SQL查詢的中間結果。 沒有假脫機空間的用戶無法執(zhí)行任何查詢。
與永久空間類似,假脫機空間定義了用戶可以使用的最大空間量。 線圈空間除以AMP的數(shù)量。 每當每個AMP限制超過,用戶將得到假脫機空間錯誤。
臨時空間是未使用的永久空間,由全局臨時表使用。 溫度空間也除以AMP的數(shù)量。
表只能包含一個主索引。 更多情況下,您會遇到表包含其他列的情況,使用這些列來頻繁訪問數(shù)據(jù)。 Teradata將對這些查詢執(zhí)行全表掃描。 輔助索引解決此問題。
輔助索引是訪問數(shù)據(jù)的備用路徑。 主索引和輔助索引之間存在一些差異。
次級索引不涉及數(shù)據(jù)分發(fā)。
輔助索引值存儲在子表中。 這些表是在所有AMP中內(nèi)置的。
輔助索引是可選的。
它們可以在創(chuàng)建表期間或在創(chuàng)建表之后創(chuàng)建。
它們占用額外的空間,因為它們構建子表,并且它們還需要維護,因為需要為每個新行更新子表。
有兩種類型的輔助索引 -
唯一輔助索引只允許定義為USI的列的唯一值。 通過USI訪問該行是一個雙放大操作。
以下示例在Employee表的EmployeeNo列上創(chuàng)建USI。
CREATE UNIQUE INDEX(EmployeeNo) on employee;
非唯一二級索引允許定義為NUSI的列的重復值。 通過NUSI訪問該行是全放大器操作。
以下示例在employee表的FirstName列上創(chuàng)建NUSI。
CREATE INDEX(FirstName) on Employee;
Teradata優(yōu)化器提出了每個SQL查詢的執(zhí)行策略。 此執(zhí)行策略基于在SQL查詢中使用的表收集的統(tǒng)計信息。 使用COLLECT STATISTICS命令收集表上的統(tǒng)計信息。 優(yōu)化器需要環(huán)境信息和數(shù)據(jù)人口統(tǒng)計數(shù)據(jù)來制定最佳執(zhí)行策略。
有三種方法來收集表上的統(tǒng)計信息。
COLLECT STATISTICS命令用于收集表上的統(tǒng)計信息。
以下是收集表上的統(tǒng)計信息的基本語法。
COLLECT [SUMMARY] STATISTICS INDEX (indexname) COLUMN (columnname) ON <tablename>;
以下示例收集Employee表的EmployeeNo列的統(tǒng)計信息。
COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。
*** Update completed. 2 rows changed. *** Total elapsed time was 1 second.
您可以使用HELP STATISTICS命令查看收集的統(tǒng)計信息。
以下是查看收集的統(tǒng)計信息的語法。
HELP STATISTICS <tablename>;
以下是查看在Employee表上收集的統(tǒng)計信息的示例。
HELP STATISTICS employee;
當執(zhí)行上述查詢時,它產(chǎn)生以下結果。
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中,壓縮最多可以壓縮255個不同的值,包括NULL。 由于存儲已減少,Teradata可以在塊中存儲更多記錄。 這導致改進的查詢響應時間,因為任何I / O操作可以每塊處理更多行。 可以在使用CREATE TABLE創(chuàng)建表或使用ALTER TABLE命令創(chuàng)建表之后添加壓縮。
下表壓縮值為1,2和3的字段DepatmentNo。對列應用壓縮時,此列的值不與該行一起存儲。 相反,值存儲在每個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);
當在具有有限值的大表中具有列時,可以使用多值壓縮。
EXPLAIN命令以英語返回解析引擎的執(zhí)行計劃。 它可以與除另一個EXPLAIN命令之外的任何SQL語句一起使用。 當查詢前面有EXPLAIN命令時,解析引擎的執(zhí)行計劃將返回給用戶,而不是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計劃的一些示例。
當在SELECT語句中沒有指定條件時,優(yōu)化器可以選擇在訪問表的每一行時使用全表掃描。
以下是一個示例查詢,其中優(yōu)化程序可以選擇FTS。
EXPLAIN SELECT * FROM employee;
當執(zhí)行上述查詢時,它將產(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.
當使用唯一主索引訪問行時,則它是一個AMP操作。
EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;
當執(zhí)行上述查詢時,它將產(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.
當使用唯一二級索引訪問行時,它是一個雙放大操作。
考慮具有以下定義的表薪水。
CREATE SET TABLE SALARY,FALLBACK ( EmployeeNo INTEGER, Gross INTEGER, Deduction INTEGER, NetPay INTEGER ) PRIMARY INDEX ( EmployeeNo ) UNIQUE INDEX (EmployeeNo);
請考慮以下SELECT語句。
EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。 可以看出,優(yōu)化器在使用唯一二級索引的兩個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計劃中常見的術語列表。
...(最后使用)...
不再需要假脫機文件,并且將在此步驟完成后釋放。
...沒有殘余條件...
所有適用的條件已應用于行。
... END TRANSACTION ...
... END TRANSACTION ... ...
...消除重復行...
...消除重復行... ...
...通過遍歷索引#n僅提取行id ... ...
...通過遍歷索引#n僅提取行id ... ... ...
構建了一個假脫機文件,其中包含在輔助索引(索引#n)中找到的行標識...
...我們做一個短信(設置操作步驟)... ...
...由散列碼重新分配給所有AMP。
...由散列碼重新分配給所有AMP。...
...在所有AMP上重復。
在準備加入時,從較小的表(根據(jù)SPOOL)復制數(shù)據(jù)。
...(one_AMP)或(group_AMPs)
...(one_AMP)或(group_AMPs)...
基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個AMP獲取行。
基于主索引值將行分配給特定的AMP。 Teradata使用散列算法來確定哪個AMP獲取行。...
以下是插入數(shù)據(jù)的步驟。
以下是插入數(shù)據(jù)的步驟。...
解析器接收查詢并將記錄的PI值傳遞給散列算法。
解析器接收查詢并將記錄的PI值傳遞給散列算法。...
行散列(前16位)的高階位用于標識散列映射條目。 哈希映射包含一個AMP#。 哈希映射是包含特定AMP#的桶的數(shù)組。
BYNET將數(shù)據(jù)發(fā)送到標識的AMP。
AMP使用32位行散列來定位其磁盤中的行。
AMP使用32位行散列來定位其磁盤中的行。...
行散列和唯一性ID的組合稱為行ID。
行散列和唯一性ID的組合稱為行ID。...
AMP中的每個表行都按其行ID進行邏輯排序。
AMP中的每個表行都按其行ID進行邏輯排序。...
行哈希 | 唯一性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是一個物化視圖。 其定義是永久存儲的,并且只要更新連接索引中引用的基表,就會更新數(shù)據(jù)。 JOIN INDEX可以包含一個或多個表,并且還包含預聚合數(shù)據(jù)。 連接索引主要用于提高性能。
JOIN INDEX是一個物化視圖。 其定義是永久存儲的,并且只要更新連接索引中引用的基表,就會更新數(shù)據(jù)。 JOIN INDEX可以包含一個或多個表,并且還包含預聚合數(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列上進行散列。 如果未定義連接索引且employee_name未定義為輔助索引,則系統(tǒng)將執(zhí)行全表掃描以訪問耗時的行。
您可以運行以下EXPLAIN計劃并驗證優(yōu)化程序計劃。 在以下示例中,您可以看到,當表使用Employee_Name列查詢時,優(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.
您可以運行以下EXPLAIN計劃并驗證優(yōu)化程序計劃。 在以下示例中,您可以看到,當表使用Employee_Name列查詢時,優(yōu)化程序正在使用Join Index而不是base Employee表。...
以下示例通過連接Employee和Salary表來創(chuàng)建一個名為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)建一個名為Employee_Salary_JI的JOIN INDEX。...
如果表在某些列上始終聚合,則可以在表上定義聚合連接索引以提高性能。 聚合連接索引的一個限制是它僅支持SUM和COUNT函數(shù)。
在以下示例中,加入員工和工資以確定每個部門的總工資。
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);
視圖是由查詢構建的數(shù)據(jù)庫對象。 可以使用單個表或通過連接的多個表來構建視圖。 它們的定義永久存儲在數(shù)據(jù)字典中,但它們不存儲數(shù)據(jù)的副本。 視圖的數(shù)據(jù)是動態(tài)構建的。
視圖可以包含表的行的子集或表的列的子集。
視圖是使用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;
當執(zhí)行上述查詢時,它將產(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
當執(zhí)行上述查詢時,它將產(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>;
下面是一個刪除視圖Employee_View的示例。
DROP VIEW Employee_View;
下面是一個刪除視圖Employee_View的示例。...
用戶只能訪問視圖而不是基表。
用戶只能訪問視圖而不是基表。...
宏是一組SQL語句,通過調(diào)用宏名稱來存儲和執(zhí)行。 宏的定義存儲在數(shù)據(jù)字典中。 用戶只需要EXEC特權來執(zhí)行宏。 用戶不需要對宏中使用的數(shù)據(jù)庫對象具有單獨的特權。 宏語句作為單個事務執(zhí)行。 如果宏中的某個SQL語句失敗,則所有語句都將回滾。 宏可以接受參數(shù)。 宏可以包含DDL語句,但應該是宏中的最后一個語句。
宏是一組SQL語句,通過調(diào)用宏名稱來存儲和執(zhí)行。 宏的定義存儲在數(shù)據(jù)字典中。 用戶只需要EXEC特權來執(zhí)行宏。 用戶不需要對宏中使用的數(shù)據(jù)庫對象具有單獨的特權。 宏語句作為單個事務執(zhí)行。 如果宏中的某個SQL語句失敗,則所有語句都將回滾。 宏可以接受參數(shù)。 宏可以包含DDL語句,但應該是宏中的最后一個語句。...
以下是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)建一個名為Get_Emp的宏。 它包含一個select語句來從employee表中檢索記錄。
CREATE MACRO Get_Emp AS ( SELECT EmployeeNo, FirstName, LastName FROM employee ORDER BY EmployeeNo; );
下面的示例創(chuàng)建一個名為Get_Emp的宏。 它包含一個select語句來從employee表中檢索記錄。...
以下是EXECUTE MACRO命令的語法。
EXEC <macroname>;
以下示例執(zhí)行宏名稱Get_Emp; 執(zhí)行以下命令時,它將從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ù)用引用; (分號)。
Teradata宏可以接受參數(shù)。 在宏內(nèi),這些參數(shù)用引用; (分號)。...
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( SELECT EmployeeNo, NetPay FROM Salary WHERE EmployeeNo = :EmployeeNo; );
宏使用EXEC命令執(zhí)行。 您需要EXEC特權才能執(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
存儲過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲過程的定義存儲在數(shù)據(jù)庫中,參數(shù)存儲在數(shù)據(jù)字典表中。
存儲過程包含一組SQL語句和過程語句。 它們可能只包含程序性聲明。 存儲過程的定義存儲在數(shù)據(jù)庫中,參數(shù)存儲在數(shù)據(jù)字典表中。...
提供更好的安全性,因為通過存儲過程訪問數(shù)據(jù),而不是直接訪問它們。
提供更好的安全性,因為通過存儲過程訪問數(shù)據(jù),而不是直接訪問它們。...
存儲過程使用CREATE PROCEDURE語句創(chuàng)建。
存儲過程使用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;
存儲過程使用CALL語句執(zhí)行。
以下是CALL語句的通用語法。
CALL <procedure name> [(parameter values)];
以下示例調(diào)用存儲過程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方法是 - ...
如果連接列是相應表的主索引,則連接行已在同一AMP上。 在這種情況下,不需要分配。
如果連接列是相應表的主索引,則連接行已在同一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);
當這兩個表在EmployeeNo列上連接時,不會發(fā)生重新分配,因為EmployeeNo是正在連接的兩個表的主索引。
當這兩個表在EmployeeNo列上連接時,不會發(fā)生重新分配,因為EmployeeNo是正在連接的兩個表的主索引。...
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 );
如果這兩個表在DeparmentNo列上連接,那么這些行需要重新分布,因為DepartmentNo是一個表中的主索引和另一個表中的非主索引。 在這種情況下,加入行可能不在同一個AMP上。 在這種情況下,Teradata可能會在DepartmentNo列重新分發(fā)employee表。
如果這兩個表在DeparmentNo列上連接,那么這些行需要重新分布,因為DepartmentNo是一個表中的主索引和另一個表中的非主索引。 在這種情況下,加入行可能不在同一個AMP上。 在這種情況下,Teradata可能會在DepartmentNo列重新分發(fā)employee表。...
嵌套連接不使用所有AMP。 對于嵌套連接發(fā)生,其中一個條件應該是一個表的唯一主索引上的相等,然后將此列連接到另一個表上的任何索引。
嵌套連接不使用所有AMP。 對于嵌套連接發(fā)生,其中一個條件應該是一個表的唯一主索引上的相等,然后將此列連接到另一個表上的任何索引。...
Product Join將來自一個表的每個限定行與來自其他表的每個限定行進行比較。 產(chǎn)品加入可能由于以下某些因素而發(fā)生:
分區(qū)主索引(PPI)是一種索引機制,可用于提高某些查詢的性能。 當將行插入到表中時,它們存儲在AMP中并按其行散列順序排列。 當使用PPI定義表時,行按其分區(qū)編號排序。 在每個分區(qū)中,它們按其行散列排列。 根據(jù)定義的分區(qū)表達式將行分配給分區(qū)。
避免對某些查詢進行全表掃描。
避免使用需要額外物理結構和額外I / O維護的輔助索引。
快速訪問大表的子集。
快速刪除舊數(shù)據(jù)并添加新數(shù)據(jù)。
考慮以下OrderNo主索引的Orders表。
StoreNo | 訂單號 | 訂購日期 | 合計訂單 |
---|---|---|---|
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 |
假設記錄分布在AMP之間,如下表所示。 記錄存儲在AMP中,基于它們的行哈希排序。
RowHash | 訂單號 | 訂購日期 |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | 訂單號 | 訂購日期 |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
如果運行查詢以提取特定日期的訂單,則優(yōu)化程序可以選擇使用全表掃描,然后可以訪問AMP中的所有記錄。 為了避免這種情況,您可以將訂單日期定義為分區(qū)主索引。 將行插入到訂單表中時,它們按訂單日期進行分區(qū)。 在每個分區(qū)中,它們將按其行哈希排序。
以下數(shù)據(jù)顯示如果記錄按訂單日期分區(qū),則記錄將如何存儲在AMP中。 如果運行查詢以按訂單日期訪問記錄,則只會訪問包含該特定訂單的記錄的分區(qū)。
以下數(shù)據(jù)顯示如果記錄按訂單日期分區(qū),則記錄將如何存儲在AMP中。 如果運行查詢以按訂單日期訪問記錄,則只會訪問包含該特定訂單的記錄的分區(qū)。...
劃分 | RowHash | 訂單號 | 訂購日期 |
---|---|---|---|
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... | 訂購日期 |
---|---|---|---|
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ū)。 每天將有一個單獨的分區(qū)。
OLAP函數(shù)類似于聚合函數(shù),除了聚合函數(shù)只返回一個值,而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的累計金額或運行總計的示例。 記錄按EmployeeNo排序,累積和計算在NetPay列上。
SELECT EmployeeNo, NetPay, SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS UNBOUNDED PRECEDING) as TotalSalary FROM Salary;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。
EmployeeNo NetPay TotalSalary ----------- ----------- ----------- 101 36000 36000 102 74000 110000 103 83000 193000 104 70000 263000 105 18000 281000
當執(zhí)行上述查詢時,它將產(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 |
以下查詢通過加入日期對雇員表的記錄進行排序,并在“加入日期”中分配排名。
SELECT EmployeeNo, JoinedDate,RANK() OVER(ORDER BY JoinedDate) as Seniority FROM Employee;
當執(zhí)行上述查詢時,它將產(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子句中定義的列對數(shù)據(jù)進行分組,并在每個組中執(zhí)行OLAP功能。 以下是使用PARTITION BY子句的查詢的示例。
SELECT EmployeeNo, JoinedDate,RANK() OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority FROM Employee;
當執(zhí)行上述查詢時,它將產(chǎn)生以下輸出。 您可以看到每個部門都重置了排名。
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ù)保護的可用功能。
Teradata使用瞬態(tài)日志來保護數(shù)據(jù)免受事務故障的影響。 無論何時運行任何事務,Transient journal都會保留受影響行的before映像的副本,直到事務成功或回滾成功。 然后,丟棄之前的圖像。 瞬時日志保存在每個AMP中。 這是一個自動過程,不能禁用。
回退通過將表的行的第二副本存儲在稱為回退AMP的另一AMP上來保護表數(shù)據(jù)。 如果一個AMP出現(xiàn)故障,則會訪問回退行。 這樣,即使一個AMP出現(xiàn)故障,通過備用AMP仍然可以獲得數(shù)據(jù)。 Fallback選項可用于表創(chuàng)建或表創(chuàng)建后。 回退確保表的行的第二副本總是存儲在另一個AMP中以保護數(shù)據(jù)免于AMP故障。 但是,回退占用的存儲空間和I / O的兩倍,用于插入/刪除/更新。
下圖顯示了如何將行的后備副本存儲在另一個AMP中。
當AMP故障并且表受回退保護時,將激活Down AMP恢復日志。 此日志記錄對失敗的AMP的數(shù)據(jù)的所有更改。 在集群中剩余的AMP上激活日志。 這是一個自動過程,不能禁用。 一旦失敗的AMP生效,則來自下行AMP恢復日志的數(shù)據(jù)與AMP同步。 一旦完成,日志將被丟棄。
Clique是Teradata用來保護數(shù)據(jù)免受節(jié)點故障的機制。 clique只是一組共享一組公共磁盤陣列的Teradata節(jié)點。 當節(jié)點出現(xiàn)故障時,來自故障節(jié)點的vprocs將遷移到clique中的其他節(jié)點,并繼續(xù)訪問其磁盤陣列。
熱備節(jié)點是不參與生產(chǎn)環(huán)境的節(jié)點。 如果節(jié)點出現(xiàn)故障,則故障節(jié)點的vprocs將遷移到熱備份節(jié)點。 一旦故障節(jié)點恢復,它將成為熱備份節(jié)點。 熱備節(jié)點用于在節(jié)點故障的情況下維持性能。
熱備節(jié)點是不參與生產(chǎn)環(huán)境的節(jié)點。 如果節(jié)點出現(xiàn)故障,則故障節(jié)點的vprocs將遷移到熱備份節(jié)點。 一旦故障節(jié)點恢復,它將成為熱備份節(jié)點。 熱備節(jié)點用于在節(jié)點故障的情況下維持性能。...
RAID 1通常用于Teradata。 在RAID 1中,每個磁盤與鏡像磁盤相關聯(lián)。 對主磁盤中的數(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)建用戶時,用戶名,永久空間和密碼的值是必需的。 其他字段是可選的。
以下是創(chuàng)建用戶TD01的示例。
CREATE USER TD01 AS PERMANENT = 1000000 BYTES PASSWORD = ABC$124 TEMPORARY = 1000000 BYTES SPOOL = 1000000 BYTES;
在創(chuàng)建新用戶時,可以將用戶分配到帳戶。 CREATE USER中的ACCOUNT選項用于分配帳戶。 用戶可以分配到多個帳戶。
以下是具有帳戶選項的CREATE USER的語法。
CREATE USER username PERM = n BYTES PASSWORD = password ACCOUNT = accountid
以下是具有帳戶選項的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ù)庫對象的一個或多個特權分配給用戶或數(shù)據(jù)庫。
以下是GRANT命令的語法。
GRANT privileges ON objectname TO username;
特權可以是INSERT,SELECT,UPDATE,REFERENCES。
以下是GRANT語句的示例。
GRANT SELECT,INSERT,UPDATE ON Employee TO TD01;
REVOKE命令從用戶或數(shù)據(jù)庫中刪除特權。 REVOKE命令只能刪除顯式權限。
以下是REVOKE命令的基本語法。
REVOKE [ALL|privileges] ON objectname FROM username;
以下是REVOKE命令的示例。
REVOKE INSERT,SELECT ON Employee FROM TD01;
本章討論Teradata中性能調(diào)整的過程。
性能調(diào)整的第一步是在查詢中使用EXPLAIN。 EXPLAIN計劃提供了優(yōu)化程序如何執(zhí)行查詢的詳細信息。 在解釋計劃中,檢查關鍵字,如置信度級別,使用的連接策略,假脫機文件大小,重新分配等。
優(yōu)化程序使用數(shù)據(jù)受眾特征來制定有效的執(zhí)行策略。 COLLECT STATISTICS命令用于收集表的數(shù)據(jù)人口統(tǒng)計。 確保在列上收集的統(tǒng)計數(shù)據(jù)是最新的。
收集在WHERE子句中使用的列以及在連接條件中使用的列上的統(tǒng)計信息。
收集唯一主索引列的統(tǒng)計信息。
收集非唯一二級索引列的統(tǒng)計信息。 優(yōu)化器將決定是否可以使用NUSI或全表掃描。
通過基表上的統(tǒng)計信息收集聯(lián)接索引的統(tǒng)計信息。
收集分區(qū)列上的統(tǒng)計信息。
確保使用正確的數(shù)據(jù)類型。 這將避免使用超過所需的過量存儲。
請確保連接條件中使用的列的數(shù)據(jù)類型兼容,以避免顯式數(shù)據(jù)轉換。
刪除不必要的ORDER BY子句,除非必需。
如果查詢超過該用戶的每個AMP卷軸空間限制,則會生成假脫機空間錯誤。 驗證解釋計劃并識別占用更多假脫機空間的步驟。 這些中間查詢可以拆分并單獨放置以構建臨時表。
確保為表正確定義了主索引。 主索引列應均勻分布數(shù)據(jù),應經(jīng)常用于訪問數(shù)據(jù)。
如果定義了SET表,那么優(yōu)化器將檢查記錄是否與插入的每個記錄重復。 要刪除重復檢查條件,可以為表定義唯一輔助索引。
更新大表將是耗時的。 您可以刪除記錄,并插入帶有修改行的記錄,而不是更新表。
刪除臨時表(臨時表)和揮發(fā)性(如果不再需要它們)。 這將釋放永久空間和假脫機空間。
如果確定輸入記錄不具有重復記錄,則可以將目標表定義為MULTISET表,以避免SET表使用重復行檢查。
FastLoad實用程序用于將數(shù)據(jù)加載到空表。 由于它不使用臨時日志,因此可以快速加載數(shù)據(jù)。 即使目標表是MULTISET表,它也不會加載重復行。
目標表不應該有二級索引,連接索引和外鍵引用。
FastLoad在兩個階段執(zhí)行。
解析引擎從輸入文件中讀取記錄,并向每個AMP發(fā)送一個塊。
每個AMP存儲記錄塊。
然后AMP散列每個記錄,并將它們重新分配到正確的AMP。
然后AMP散列每個記錄,并將它們重新分配到正確的AMP。...
階段2在FastLoad接收到END LOADING語句時啟動。
每個AMP對行散列上的記錄進行排序,并將它們寫入磁盤。
釋放目標表上的鎖,并刪除錯誤表。
釋放目標表上的鎖,并刪除錯誤表。...
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
下面是一個示例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中使用以下命令運行FastLoad腳本。
FastLoad < EmployeeLoad.fl;
一旦執(zhí)行上述命令,F(xiàn)astLoad腳本將運行并產(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腳本中使用的常用術語列表。
LOGON - 登錄到Teradata并啟動一個或多個會話。
DATABASE - 設置默認數(shù)據(jù)庫。
BEGIN LOADING - 標識要加載的表。
ERRORFILES - 標識需要創(chuàng)建/更新的2個錯誤表。
CHECKPOINT - 定義何時采取檢查點。
SET RECORD - 指定輸入文件格式是格式化,二進制,文本還是未格式化。
DEFINE - 定義輸入文件布局。
FILE - 指定輸入文件名和路徑。
INSERT - 將輸入文件中的記錄插入目標表中。
INSERT - 將輸入文件中的記錄插入目標表中。...
LOGOFF - 結束所有會話并終止FastLoad。
MultiLoad可以一次加載多個表,它還可以執(zhí)行不同類型的任務,如INSERT,DELETE,UPDATE和UPSERT。 它一次最多可以加載5個表,并在腳本中執(zhí)行多達20個DML操作。 MultiLoad不需要目標表。
MultiLoad支持兩種模式 -
除了目標表之外,MultiLoad還需要一個工作表,一個日志表和兩個錯誤表。
日志表 - 用于維護在加載期間采用的檢查點,用于重新啟動。
錯誤表 - 在發(fā)生錯誤時,在加載期間插入這些表。 第一個錯誤表存儲轉換錯誤,而第二個錯誤表存儲重復記錄。
日志表 - 維護MultiLoad每個階段的結果,以便重新啟動。
工作表 - MultiLoad腳本為每個目標表創(chuàng)建一個工作表。 工作表用于保留DML任務和輸入數(shù)據(jù)。
MultiLoad有一些限制。
MultiLoad導入有五個階段 -
MultiLoad導入有五個階段 - ...
階段2 - DML事務階段 - 驗證DML語句的語法并將其帶到Teradata系統(tǒng)。
階段3 - 獲取階段 - 將輸入數(shù)據(jù)置于工作表中并鎖定表。
階段4 - 應用程序階段 - 應用所有DML操作。
階段4 - 應用程序階段 - 應用所有DML操作。...
MultiLoad腳本中涉及的步驟是 -
步驟1 - 設置日志表。
步驟2 - 登錄到Teradata。
步驟3 - 指定目標,工作和錯誤表。
步驟3 - 指定目標,工作和錯誤表。...
步驟5 - 定義DML查詢。
步驟6 - 命名IMPORT文件。
步驟7 - 指定要使用的布局。
步驟8 - 啟動加載。
步驟9 - 完成加載并終止會話。
創(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
以下示例是一個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;
以下示例是一個MultiLoad腳本,它從employee表中讀取記錄并加載到Employee_Stg表中。...
Multiload < EmployeeLoad.ml;
FastExport實用程序用于將Teradata表中的數(shù)據(jù)導出為平面文件。 它還可以生成報告格式的數(shù)據(jù)。 可以使用Join從一個或多個表中提取數(shù)據(jù)。 由于FastExport導出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表導出數(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腳本中常用的術語列表。
LOGTABLE - 指定用于重新啟動目的的日志表。
LOGON - 登錄到Teradata并啟動一個或多個會話。
DATABASE - 設置默認數(shù)據(jù)庫。
DATABASE - 設置默認數(shù)據(jù)庫。...
EXPORT - 指定目標文件和導出格式。
SELECT - 指定要導出數(shù)據(jù)的選擇查詢。
END EXPORT - 指定FastExport的結束。
LOGOFF - 結束所有會話并終止FastExport。
LOGOFF - 結束所有會話并終止FastExport。...
以下是BTEQ腳本中常用的術語列表。
LOGON - 用于登錄Teradata系統(tǒng)。
ACTIVITYCOUNT - 返回受上一個查詢影響的行數(shù)。
ERRORCODE - 返回上一個查詢的狀態(tài)代碼。
DATABASE - 設置默認數(shù)據(jù)庫。
DATABASE - 設置默認數(shù)據(jù)庫。...
RUN FILE - 執(zhí)行文件中包含的查詢。
GOTO - 將控制權轉移到標簽。
LOGOFF - 從數(shù)據(jù)庫注銷并終止所有會話。
IMPORT - 指定輸入文件路徑。
EXPORT - 指定輸出文件路徑并啟動導出。
以下是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í)行以下任務。
登錄到Teradata系統(tǒng)。
設置缺省數(shù)據(jù)庫。
創(chuàng)建名為employee_bkup的表。
從Employee表中選擇一個記錄,以檢查表是否有任何記錄。
如果表為空,則刪除employee_bkup表。
如果表為空,則刪除employee_bkup表。...
在每個SQL語句之后,檢查ERRORCODE以確保語句成功。
ACTIVITYCOUNT返回先前SQL查詢選擇/影響的記錄數(shù)。
更多建議: