Teradata-quick-guide

提供:Dev Guides
移動先:案内検索

Teradata-はじめに

Teradataとは何ですか?

Teradataは、人気のあるリレーショナルデータベース管理システムの1つです。 主に、大規模なデータウェアハウジングアプリケーションの構築に適しています。 Teradataは、並列処理の概念によりこれを実現しています。 Teradataという会社によって開発されました。

Teradataの歴史

以下は、Teradataの歴史の概要であり、主要なマイルストーンをリストしています。

  • 1979 -Teradataが組み込まれました。
  • 1984 -最初のデータベースコンピュータDBC/1012のリリース。
  • 1986 -_Fortune_誌はTeradataを「Product of the Year」と命名しています。
  • 1999 -130テラバイトのTeradataを使用した世界最大のデータベース。
  • 2002 -パー​​ティションプライマリインデックスと圧縮を備えたTeradata V2R5がリリースされました。
  • 2006 -Teradata Master Data Managementソリューションの発売。
  • 2008 -Active Data WarehousingとともにTeradata 13.0がリリースされました。
  • 2011 -Teradata Asterを取得し、Advanced Analytics Spaceに入ります。
  • 2012 -Teradata 14.0が導入されました。
  • 2014 -Teradata 15.0が導入されました。

Teradataの機能

以下はTeradataの機能の一部です-

  • 無制限の並列処理-Teradataデータベースシステムは、超並列処理(MPP)アーキテクチャに基づいています。 MPPアーキテクチャは、システム全体でワークロードを均等に分割します。 Teradataシステムは、タスクをプロセスに分割し、それらを並行して実行して、タスクが迅速に完了するようにします。
  • Shared Nothing Architecture -Teradataのアーキテクチャは、Shared Nothing Architectureと呼ばれます。 Teradataノード、そのアクセスモジュールプロセッサ(AMP)、およびAMPに関連付けられたディスクは独立して動作します。 他の人と共有されません。
  • 線形スケーラビリティ-Teradataシステムは非常にスケーラブルです。 最大2048ノードまで拡張できます。 たとえば、AMPの数を2倍にすることで、システムの容量を2倍にすることができます。
  • 接続性-Teradataは、メインフレームやネットワーク接続システムなどのチャネル接続システムに接続できます。
  • Mature Optimizer -Teradataオプティマイザーは、市場で成熟したオプティマイザーの1つです。 当初から並行するように設計されています。 リリースごとに改善されています。
  • SQL -Teradataは業界標準のSQLをサポートし、テーブルに保存されているデータとやり取りします。 これに加えて、独自の拡張機能を提供します。
  • 堅牢なユーティリティ-Teradataは、FastLoad、MultiLoad、FastExport、TPTなどのTeradataシステムとの間でデータをインポート/エクスポートするための堅牢なユーティリティを提供します。
  • 自動配布-Teradataは、手動の介入なしで、データをディスクに自動的に均等に配布します。

Teradata-インストール

Teradataは、完全に機能するTeradata仮想マシンであるVMWAREにTeradata Expressを提供します。 最大1テラバイトのストレージを提供します。 Teradataは、VMwareの40GBバージョンと1TBバージョンの両方を提供します。

前提条件

VMは64ビットなので、CPUは64ビットをサポートする必要があります。

Windowsのインストール手順

  • ステップ2 *-ファイルを抽出し、ターゲットフォルダーを指定します。
  • ステップ3 *-リンクhttps://my.vmware.com/web/vmware/downloadsからVMWare Workstationプレーヤーをダウンロードします。 WindowsとLinuxの両方で使用できます。 Windows用のVMWAREワークステーションプレーヤーをダウンロードします。

VMWare Workstationプレーヤー

  • ステップ4 *-ダウンロードが完了したら、ソフトウェアをインストールします。
  • ステップ5 *-インストールが完了したら、VMWAREクライアントを実行します。
  • ステップ6 *-[仮想マシンを開く]を選択します。 抽出されたTeradata VMWareフォルダーをナビゲートし、拡張子が.vmdkのファイルを選択します。

仮想マシンを開く

  • ステップ7 *-Teradata VMWareがVMWareクライアントに追加されます。 追加されたTeradata VMwareを選択し、「仮想マシンの再生」をクリックします。

仮想マシンの再生

  • ステップ8 *-ソフトウェアの更新に関するポップアップが表示されたら、[後で通知する]を選択できます。
  • ステップ9 *-rootとしてユーザー名を入力し、tabを押してrootとしてパスワードを入力し、もう一度Enterを押します。

Welcome TDExpress

  • ステップ10 *-次の画面がデスクトップに表示されたら、「root’s home」をダブルクリックします。 次に、「Genome’s Terminal」をダブルクリックします。 これにより、シェルが開きます。

シェルを開く

  • ステップ11 *-次のシェルから、コマンド/etc/init.d/tpa startを入力します。 これにより、Teradataサーバーが起動します。

Teradataサーバーの起動

BTEQの開始

BTEQユーティリティは、SQLクエリをインタラクティブに送信するために使用されます。 BTEQユーティリティを起動する手順は次のとおりです。

  • ステップ1 *-/sbin/ifconfigコマンドを入力し、VMWareのIPアドレスを書き留めます。
  • ステップ2 *-コマンドbteqを実行します。 ログオンプロンプトで、コマンドを入力します。

ログオン<ipaddress>/dbc、dbc;パスワードプロンプトで、dbcとしてパスワードを入力します。

Starting BTEQ

BTEQを使用してTeradataシステムにログインし、SQLクエリを実行できます。

Teradata-アーキテクチャ

Teradataアーキテクチャは、超並列処理(MPP)アーキテクチャに基づいています。 Teradataの主要コンポーネントは、解析エンジン、BYNET、およびアクセスモジュールプロセッサ(AMP)です。 次の図は、Teradataノードの高レベルアーキテクチャを示しています。

Teradata Node Architecture

Teradataのコンポーネント

Teradataの主要なコンポーネントは次のとおりです-

  • ノード-Teradata Systemの基本単位です。 Teradataシステム内の個々のサーバーは、ノードと呼ばれます。 ノードは、独自のオペレーティングシステム、CPU、メモリ、Teradata RDBMSソフトウェアの独自のコピー、およびディスクスペースで構成されます。 キャビネットは、1つ以上のノードで構成されます。
  • 解析エンジン-解析エンジンは、クライアントからクエリを受信し、効率的な実行計画を準備します。 解析エンジンの責任は次のとおりです-
  • クライアントからSQLクエリを受信する
  • 構文エラーのSQLクエリチェックを解析する
  • ユーザーがSQLクエリで使用されるオブジェクトに対して必要な特権を持っているかどうかを確認します
  • SQLで使用されるオブジェクトが実際に存在するかどうかを確認します
  • SQLクエリを実行するための実行計画を準備し、それをBYNETに渡す
  • AMPから結果を受け取り、クライアントに送信します
  • メッセージパッシングレイヤー-BYNETと呼ばれるメッセージパッシングレイヤーは、Teradataシステムのネットワークレイヤーです。 これにより、PEとAMPの間、およびノー​​ド間の通信が可能になります。 Parsing Engineから実行計画を受け取り、AMPに送信します。 同様に、AMPから結果を受信し、解析エンジンに送信します。
  • アクセスモジュールプロセッサ(AMP)-仮想プロセッサ(vproc)と呼ばれるAMPは、実際にデータを保存および取得するものです。 AMPは、Parsing Engineからデータと実行計画を受け取り、データ型の変換、集約、フィルター、並べ替えを実行し、それらに関連付けられたディスクにデータを保存します。 テーブルのレコードは、システム内のAMPに均等に分散されます。 各AMPは、データが保存されるディスクのセットに関連付けられています。 そのAMPのみがディスクからデータを読み書きできます。

ストレージアーキテクチャ

クライアントがクエリを実行してレコードを挿入すると、解析エンジンはレコードをBYNETに送信します。 BYNETはレコードを取得し、行をターゲットAMPに送信します。 AMPはこれらのレコードをディスクに保存します。 次の図は、Teradataのストレージアーキテクチャを示しています。

ストレージアーキテクチャ

検索アーキテクチャ

クライアントがクエリを実行してレコードを取得すると、解析エンジンはBYNETにリクエストを送信します。 BYNETは、取得要求を適切なAMPに送信します。 次に、AMPはディスクを並行して検索し、必要なレコードを特定してBYNETに送信します。 次に、BYNETはレコードをParsing Engineに送信し、Parsing Engineはクライアントに送信します。 Teradataの取得アーキテクチャは次のとおりです。

検索アーキテクチャ

Teradata-リレーショナルの概念

リレーショナルデータベース管理システム(RDBMS)は、データベースとの対話を支援するDBMSソフトウェアです。 これらは、構造化照会言語(SQL)を使用して、テーブルに格納されているデータと対話します。

データベース

データベースは、論理的に関連するデータのコレクションです。 多くのユーザーがさまざまな目的でアクセスします。 たとえば、販売データベースには、多くのテーブルに格納されている販売に関する情報全体が含まれています。

テーブル

テーブルは、データが保存されるRDBMSの基本単位です。 テーブルは行と列のコレクションです。 以下は従業員テーブルの例です。

EmployeeNo FirstName LastName BirthDate
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テーブルのBirthDate列には、すべての従業員のbirth_date情報が含まれています。

BirthDate 1/5/1980 11/6/1984 3/5/1983 12/1/1984 4/1/1983

Row

行は、すべての列の1つのインスタンスです。 たとえば、従業員テーブルでは、1行に1人の従業員に関する情報が含まれています。

EmployeeNo FirstName LastName BirthDate
101 Mike James 1/5/1980

主キー

主キーは、テーブル内の行を一意に識別するために使用されます。 主キー列では重複値は許可されず、NULL値を受け入れることはできません。 テーブルの必須フィールドです。

外部キー

外部キーは、テーブル間の関係を構築するために使用されます。 子テーブルの外部キーは、親テーブルの主キーとして定義されます。 テーブルは複数の外部キーを持つことができます。 重複する値とnull値を受け入れることができます。 テーブルの外部キーはオプションです。

Teradata-データ型

テーブルの各列は、データ型に関連付けられています。 データ型は、列に格納される値の種類を指定します。 Teradataはいくつかのデータタイプをサポートしています。 以下は、頻繁に使用されるデータ型の一部です。

Data Types Length (Bytes) Range of values
BYTEINT 1 -128 to PLUS127
SMALLINT 2 -32768 to PLUS32767
INTEGER 4 -2,147,483,648 to PLUS2147,483,647
BIGINT 8 -9,233,372,036,854,775,80 8 to PLUS9,233,372,036,854,775,8 07
DECIMAL 1-16  
NUMERIC 1-16  
FLOAT 8 IEEE format
CHAR Fixed Format 1-64,000
VARCHAR Variable 1-64,000
DATE 4 YYYYYMMDD
TIME 6 or 8 HHMMSS.nnnnnn *or *HHMMSS.nnnnnnPLUSHHMM
TIMESTAMP 10 or 12 YYMMDDHHMMSS.nnnnnn* or* YYMMDDHHMMSS.nnnnnn PLUSHHMM

Teradata-テーブル

リレーショナルモデルのテーブルは、データのコレクションとして定義されます。 それらは行と列として表されます。

テーブルの種類

タイプTeradataはさまざまなタイプのテーブルをサポートしています。

  • 永続テーブル-これはデフォルトのテーブルであり、ユーザーが挿入したデータを含み、データを永続的に保存します。
  • 揮発性テーブル-揮発性テーブルに挿入されたデータは、ユーザーセッション中のみ保持されます。 テーブルとデータは、セッションの終了時に削除されます。 これらのテーブルは、主にデータ変換中に中間データを保持するために使用されます。
  • グローバルテンポラリテーブル-グローバルテンポラリテーブルの定義は永続的ですが、テーブルのデータはユーザーセッションの終了時に削除されます。
  • 派生テーブル-派生テーブルはクエリの中間結果を保持します。 それらの有効期間は、それらが作成、使用、およびドロップされるクエリ内にあります。

セット対マルチセット

Teradataは、重複レコードの処理方法に基づいて、テーブルをSETまたはMULTISETテーブルとして分類します。 SETテーブルとして定義されたテーブルは重複レコードを保存しませんが、MULTISETテーブルは重複レコードを保存できます。

Sr.No Table Commands & Description
1

Create Table

CREATE TABLEコマンドは、Teradataでテーブルを作成するために使用されます。

2

Alter Table

ALTER TABLEコマンドは、既存のテーブルから列を追加または削除するために使用されます。

3

Drop Table

DROP TABLEコマンドは、テーブルを削除するために使用されます。

Teradata-データ操作

この章では、Teradataテーブルに保存されているデータの操作に使用される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ステートメントを使用してテーブルのレコードを表示できます。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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>;

次の例では、従業員テーブルにレコードを挿入します。 次の挿入クエリを実行する前に、employeeテーブルと同じ列定義でEmployee_Bkupというテーブルを作成します。

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

上記のクエリを実行すると、employeeテーブルのすべてのレコードがemployee_bkupテーブルに挿入されます。

規則

  • VALUESリストで指定された列の数は、INSERT INTO句で指定された列と一致する必要があります。
  • NOT NULL列には値が必須です。
  • 値が指定されていない場合、NULL可能フィールドにはNULLが挿入されます。
  • VALUES句で指定された列のデータ型は、INSERT句の列のデータ型と互換性がある必要があります。

レコードを更新する

UPDATEステートメントは、テーブルからレコードを更新するために使用されます。

構文

以下は、UPDATEの一般的な構文です。

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

次の例では、従業員101の従業員部門を03に更新します。

UPDATE Employee
SET DepartmentNo = 03
WHERE EmployeeNo = 101;

次の出力では、EmployeeNo 101のDepartmentNoが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

規則

  • テーブルの1つ以上の値を更新できます。
  • WHERE条件が指定されていない場合、テーブルのすべての行が影響を受けます。
  • 別のテーブルの値でテーブルを更新できます。

レコードを削除する

DELETE FROMステートメントは、テーブルからレコードを更新するために使用されます。

構文

DELETE FROMの一般的な構文は次のとおりです。

DELETE FROM  <tablename>
[WHERE condition];

次の例では、従業員101をテーブルemployeeから削除します。

DELETE FROM Employee
WHERE EmployeeNo = 101;

次の出力では、従業員101がテーブルから削除されていることがわかります。

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

規則

  • テーブルの1つ以上のレコードを更新できます。
  • WHERE条件が指定されていない場合、テーブルのすべての行が削除されます。
  • 別のテーブルの値でテーブルを更新できます。

Teradata-SELECTステートメント

SELECTステートメントは、テーブルからレコードを取得するために使用されます。

構文

SELECTステートメントの基本的な構文は次のとおりです。

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

次の従業員表を検討してください。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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;

このクエリが実行されると、employeeテーブルからEmployeeNo、FirstName、LastName列をフェッチします。

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

テーブルからすべての列を取得する場合は、すべての列を一覧表示する代わりに次のコマンドを使用できます。

SELECT *FROM Employee;

上記のクエリは、employeeテーブルからすべてのレコードを取得します。

WHERE句

WHERE句は、SELECTステートメントによって返されるレコードをフィルタリングするために使用されます。 条件はWHERE句に関連付けられています。 WHERE句の条件を満たすレコードのみが返されます。

構文

以下は、WHERE句を使用したSELECTステートメントの構文です。

SELECT* FROM tablename
WHERE[condition];

次のクエリは、EmployeeNoが101であるレコードをフェッチします。

SELECT *FROM Employee
WHERE EmployeeNo = 101;

このクエリを実行すると、次のレコードが返されます。

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

注文する

SELECTステートメントが実行されると、返される行は特定の順序ではありません。 ORDER BY句を使用して、列のレコードを昇順/降順で並べます。

構文

以下は、ORDER BY句を使用したSELECTステートメントの構文です。

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

次のクエリは、従業員テーブルからレコードを取得し、FirstNameで結果を並べ替えます。

SELECT * FROM Employee
ORDER BY FirstName;

上記のクエリを実行すると、次の出力が生成されます。

 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列でレコードをグループ化し、各部門からの合計数を識別します。

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

上記のクエリを実行すると、次の出力が生成されます。

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

Teradata-論理演算子および条件演算子

Teradataは、次の論理演算子と条件演算子をサポートしています。 これらの演算子は、比較を実行し、複数の条件を結合するために使用されます。

Syntax Meaning
> Greater than
< Less than
>= Greater than or equal to
Less than or equal to
= Equal to
BETWEEN If values within range
IN If values in <expression>
NOT IN If values not in <expression>
IS NULL If value is NULL
IS NOT NULL If value is NOT NULL
AND Combine multiple conditions. Evaluates to true only if all conditions are met
OR Combine multiple conditions. Evaluates to true only if either of the conditions is met.
NOT Reverses the meaning of the condition

の間に

BETWEENコマンドは、値が値の範囲内にあるかどうかを確認するために使用されます。

次の従業員表を検討してください。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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の範囲にあるレコードをフェッチします。

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

上記のクエリを実行すると、従業員が101から103の間の従業員レコードが返されます。

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

IN

INコマンドは、指定された値のリストに対して値をチェックするために使用されます。

次の例では、従業員番号が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

Teradata-SET演算子

SET演算子は、複数のSELECTステートメントの結果を組み合わせます。 これは結合と似ていますが、結合は複数のテーブルの列を結合し、SET演算子は複数の行の行を結合します。

規則

  • 各SELECTステートメントの列数は同じでなければなりません。
  • 各SELECTのデータ型には互換性が必要です。
  • 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];

次の従業員表と給与表を考えてください。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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
EmployeeNo Gross Deduction 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;

クエリが実行されると、次の出力が生成されます。

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

UNION ALL

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;

上記のクエリを実行すると、次の出力が生成されます。 重複も返すことがわかります。

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

交絡

INTERSECTコマンドは、複数のSELECTステートメントからの結果を結合するためにも使用されます。 2番目のSELECTステートメントで一致する最初のSELECTステートメントから行を返します。 つまり、両方のSELECTステートメントに存在する行を返します。

構文

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;

上記のクエリを実行すると、次のレコードが返されます。 EmployeeNo 105は、SALARYテーブルに存在しないため除外されます。

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

マイナス/例外

MINUS/EXCEPTコマンドは、複数のテーブルの行を結合し、最初のSELECTにあるが2番目の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;

このクエリを実行すると、次のレコードが返されます。

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

Teradata-文字列操作

Teradataは、文字列を操作するためのいくつかの機能を提供します。 これらの関数はANSI標準と互換性があります。

Sr.No String Function & Description
1 *

文字列を連結します

2

SUBSTR

文字列の一部を抽出します(Teradata拡張機能)

3

SUBSTRING

文字列の一部を抽出します(ANSI標準)

4

INDEX

文字列内の文字の位置を特定します(Teradata拡張機能)

5

POSITION

文字列内の文字の位置を特定します(ANSI標準)

6

TRIM

文字列から空白を削除します

7

UPPER

文字列を大文字に変換します

8

LOWER

文字列を小文字に変換します

次の表に、文字列関数の一部と結果を示します。

String Function Result
SELECT SUBSTRING(‘warehouse’ FROM 1 FOR 4) ware
SELECT SUBSTR(‘warehouse’,1,4) ware
SELECT ‘data’
‘ ‘
‘warehouse’ data warehouse
SELECT UPPER(‘data’) DATA
SELECT LOWER(‘DATA’) data

Teradata-日付/時刻関数

この章では、Teradataで使用可能な日付/時刻関数について説明します。

日付の保存

日付は、次の式を使用して内部的に整数として保存されます。

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

次のクエリを使用して、日付の保存方法を確認できます。

SELECT CAST(CURRENT_DATE AS INTEGER);

日付は整数として格納されるため、日付に対していくつかの算術演算を実行できます。 Teradataは、これらの操作を実行する機能を提供します。

エキス

EXTRACT関数は、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は、DATE値とTIME値で算術演算を実行するINTERVAL関数を提供します。 INTERVAL関数には2つのタイプがあります。

年月間隔

  • YEAR
  • 年月

日中の間隔

  • DAY
  • 営業時間
  • 昼間
  • 二日目
  • HOUR
  • 数時間
  • 2時間目
  • 2分前
  • 2回目

次の例では、現在の日付に3年を追加します。

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

次の例では、現在の日付に3年と01か月を追加します。

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

次の例では、01日、05時間、10分を現在のタイムスタンプに追加します。

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

Teradata-組み込み関数

Teradataは、SQLの拡張機能である組み込み関数を提供します。 一般的な組み込み関数は次のとおりです。

Function Result
SELECT DATE; Date -------- 16/01/01
SELECT CURRENT_DATE; Date --------16/01/01
SELECT TIME; Time--------04:50:29
SELECT CURRENT_TIME; Time -------- 04:50:29
SELECT CURRENT_TIMESTAMP; Current TimeStamp(6)--------------------------------2016-01-01 04:51:06.990000PLUS00:00
SELECT DATABASE; Database------------------------------TDUSER

Teradata-集計関数

Teradataは、一般的な集計関数をサポートしています。 SELECTステートメントで使用できます。

  • COUNT -行をカウントします
  • SUM -指定された列の値を合計します
  • MAX -指定された列の大きな値を返します
  • MIN -指定された列の最小値を返します
  • AVG -指定された列の平均値を返します

次の給与表を検討してください。

EmployeeNo Gross Deduction 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テーブルのレコード数をカウントします。

SELECT count(*) from Salary;

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

MAX

次の例では、従業員の正味給与の最大値を返します。

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

MIN

次の例では、Salaryテーブルから従業員の正味最低給与額を返します。

SELECT min(NetPay) from Salary;

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

AVG

次の例では、従業員の平均給与値をテーブルから返します。

SELECT avg(NetPay) from Salary;

   Average(NetPay)
---------------------
       65800

SUM

次の例では、Salaryテーブルのすべてのレコードから従業員の純給与の合計を計算します。

SELECT sum(NetPay) from Salary;

   Sum(NetPay)
-----------------
     329000

Teradata-ケースとコアレス

この章では、TeradataのCASEおよびCOALESCE機能について説明します。

ケース式

CASE式は、各行を条件またはWHEN句に対して評価し、最初の一致の結果を返します。 一致するものがない場合、ELSE部分の結果が返されます。

構文

CASE式の構文は次のとおりです。

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

ELSE
   Result-n
END

次のEmployeeテーブルを検討してください。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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;

上記のクエリを実行すると、次の出力が生成されます。

*** 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式は、上記と同じ結果を生成する次の形式でも記述できます。

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

コーレス

COALESCEは、式の最初のnull以外の値を返すステートメントです。 式のすべての引数がNULLと評価される場合、NULLを返します。 構文は次のとおりです。

構文

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

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

NULLIF

引数が等しい場合、NULLIFステートメントはNULLを返します。

構文

NULLIFステートメントの構文は次のとおりです。

NULLIF(expression 1, expression 2)

次の例は、DepartmentNoが3の場合にNULLを返します。 それ以外の場合、DepartmentNo値を返します。

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

Teradata-結合

結合は、複数のテーブルのレコードを結合するために使用されます。 テーブルは、これらのテーブルの共通の列/値に基づいて結合されます。

さまざまな種類の結合が利用可能です。

  • 内部結合
  • 左外部結合
  • 右外部結合
  • フル外部結合
  • 自己参加
  • クロスジョイン
  • デカルト生産結合

内部結合

内部結合は、複数のテーブルのレコードを結合し、両方のテーブルに存在する値を返します。

構文

以下は、INNER JOINステートメントの構文です。

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

次の従業員表と給与表を考えてください。

EmployeeNo FirstName LastName JoinedDate DepartmentNo BirthDate
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
EmployeeNo Gross Deduction 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

次のクエリは、共通列EmployeeNoでEmployeeテーブルとSalaryテーブルを結合します。 各テーブルにはエイリアスAとBが割り当てられ、列は正しいエイリアスで参照されます。

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

上記のクエリを実行すると、次のレコードが返されます。 従業員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 は、右側のテーブルからすべてのレコードを返し、左側のテーブルから一致する行のみを返します。
  • FULL OUTER JOIN は、LEFT OUTER JOINと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>;

LEFT OUTER JOINクエリの次の例を考えてみましょう。 EmployeeテーブルのすべてのレコードとSalaryテーブルの一致するレコードを返します。

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

上記のクエリを実行すると、次の出力が生成されます。 従業員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;

上記のクエリを実行すると、次の出力が生成されます。 EmployeeテーブルのEmployeeNo 101は、Salaryテーブルのすべてのレコードと結合されます。

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

Teradata-サブクエリ

サブクエリは、別のテーブルの値に基づいて、あるテーブルのレコードを返します。 別のクエリ内のSELECTクエリです。 内部クエリとして呼び出されるSELECTクエリが最初に実行され、結果が外部クエリによって使用されます。 その顕著な特徴のいくつかは-

  • クエリには複数のサブクエリを含めることができ、サブクエリには別のサブクエリを含めることができます。
  • サブクエリは重複レコードを返しません。
  • サブクエリが1つの値のみを返す場合、=演算子を使用して外部クエリで使用できます。 複数の値を返す場合は、INまたはNOT INを使用できます。

構文

以下は、サブクエリの一般的な構文です。

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

次の給与表を検討してください。

EmployeeNo Gross Deduction 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

次のクエリは、給与が最も高い従業員番号を識別します。 内側のSELECTは集計関数を実行して最大のNetPay値を返し、外側のSELECTクエリはこの値を使用してこの値を持つ従業員レコードを返します。

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

このクエリを実行すると、次の出力が生成されます。

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

Teradata-テーブルタイプ

Teradataは、一時データを保持するために次のテーブルタイプをサポートしています。

  • 派生テーブル
  • 揮発性テーブル
  • グローバル一時表

派生テーブル

派生テーブルは、クエリ内で作成、使用、および削除されます。 これらは、クエリ内に中間結果を保存するために使用されます。

次の例は、給与が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を超える従業員が返されます。

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

揮発性テーブル

揮発性テーブルは、ユーザーセッション内で作成、使用、および削除されます。 それらの定義はデータ辞書に保存されません。 頻繁に使用されるクエリの中間データを保持します。 構文は次のとおりです。

構文

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;

上記のクエリを実行すると、次の出力が生成されます。

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

グローバル一時表

グローバル一時テーブルの定義はデータディクショナリに保存され、多くのユーザー/セッションで使用できます。 ただし、グローバル一時テーブルにロードされたデータは、セッション中のみ保持されます。 セッションごとに最大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);

上記のクエリを実行すると、次の出力が生成されます。

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

Teradata-スペースの概念

Teradataで使用できるスペースには3つのタイプがあります。

常設スペース

永続スペースは、ユーザー/データベースがデータ行を保持するために使用できるスペースの最大量です。 永続テーブル、ジャーナル、フォールバックテーブル、およびセカンダリインデックスサブテーブルは、永続スペースを使用します。

データベース/ユーザーに永続的なスペースは事前に割り当てられていません。 データベース/ユーザーが使用できるスペースの最大量として定義されています。 永続的なスペースの量は、AMPの数で除算されます。 AMPの制限ごとに超過するたびに、エラーメッセージが生成されます。

スプールスペース

スプール領域は、SQLクエリの中間結果を保持するためにシステムによって使用される未使用の永続的な領域です。 スプールスペースのないユーザーは、クエリを実行できません。

永久スペースと同様に、スプールスペースはユーザーが使用できるスペースの最大量を定義します。 スプールスペースは、AMPの数で除算されます。 AMPの制限ごとに制限を超えると、ユーザーはスプールスペースエラーを受け取ります。

一時スペース

一時スペースは、グローバル一時テーブルで使用される未使用の永続スペースです。 一時スペースもAMPの数で除算されます。

Teradata-統計

Teradataオプティマイザーは、すべてのSQLクエリの実行戦略を考え出します。 この実行戦略は、SQLクエリ内で使用されるテーブルで収集された統計に基づいています。 テーブルの統計は、COLLECT STATISTICSコマンドを使用して収集されます。 オプティマイザーでは、最適な実行戦略を立てるために環境情報とデータ人口統計が必要です。

環境情報

  • ノード、AMP、およびCPUの数
  • メモリ量

データ人口統計

  • 行の数
  • 行サイズ
  • テーブル内の値の範囲
  • 値ごとの行数
  • ヌルの数

テーブルの統計を収集するには、3つのアプローチがあります。

  • ランダムAMPサンプリング
  • 完全な統計収集
  • SAMPLEオプションの使用

統計の収集

COLLECT STATISTICSコマンドは、テーブルの統計を収集するために使用されます。

構文

以下は、テーブルの統計を収集するための基本的な構文です。

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

次の例では、EmployeeテーブルのEmployeeNo列の統計を収集します。

COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;

上記のクエリを実行すると、次の出力が生成されます。

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

統計の表示

HELP STATISTICSコマンドを使用して、収集された統計を表示できます。

構文

収集された統計を表示する構文は次のとおりです。

HELP STATISTICS <tablename>;

以下は、Employeeテーブルで収集された統計を表示する例です。

HELP STATISTICS employee;

上記のクエリを実行すると、次の結果が生成されます。

  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-圧縮

圧縮は、テーブルで使用されるストレージを削減するために使用されます。 Teradataでは、圧縮により、NULLを含む最大255の異なる値を圧縮できます。 ストレージが削減されるため、Teradataはブロックにより多くのレコードを保存できます。 これにより、どのI/O操作でもブロックごとにより多くの行を処理できるため、クエリの応答時間が改善されます。 圧縮は、CREATE TABLEを使用したテーブル作成時、またはALTER TABLEコマンドを使用したテーブル作成後に追加できます。

制限事項

  • 列ごとに圧縮できる値は255個のみです。
  • プライマリインデックス列は圧縮できません。
  • 揮発性テーブルは圧縮できません。

多値圧縮(MVC)

次の表は、値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);

複数値圧縮は、有限の値を持つ大きなテーブルに列がある場合に使用できます。

Teradata-説明

EXPLAINコマンドは、解析エンジンの実行計画を英語で返します。 別のEXPLAINコマンドを除き、任意のSQLステートメントで使用できます。 クエリの前にEXPLAINコマンドを使用すると、解析エンジンの実行計画がAMPではなくユーザーに返されます。

EXPLAINの例

次の定義を持つテーブルEmployeeを考えます。

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

EXPLAINプランの例を以下に示します。

全表スキャン(FTS)

SELECTステートメントで条件が指定されていない場合、オプティマイザーは、テーブルのすべての行にアクセスするフルテーブルスキャンの使用を選択できます。

以下は、オプティマイザーがFTSを選択できるサンプルクエリです。

EXPLAIN SELECT *FROM employee;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のように、オプティマイザーはすべての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.

一意のプライマリインデックス

一意のプライマリインデックスを使用して行にアクセスする場合、1つのAMP操作です。

EXPLAIN SELECT* FROM employee WHERE EmployeeNo = 101;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のとおり、これは単一のAMP検索であり、オプティマイザーは一意のプライマリインデックスを使用して行にアクセスしています。

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.

一意のセカンダリインデックス

Unique Secondary Indexを使用して行にアクセスすると、2アンペアの操作になります。

次の定義を持つテーブルSalaryを検討してください。

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;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のように、オプティマイザーは一意のセカンダリインデックスを使用して2アンペアで行を取得します。

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プランで一般的に見られる用語のリストです。

  1. (最後の使用)…*

スプールファイルは不要になり、この手順が完了すると解放されます。

  1. 残留条件なし…*

すべての適用可能な条件が行に適用されています。

  1. トランザクションの終了… *

トランザクションロックが解除され、変更がコミットされます。

  1. 重複行の削除…​*

重複行はスプールファイルにのみ存在し、テーブルは設定されません。 DISTINCT操作を実行します。

  1. 行IDのみを抽出するインデックス#nのトラバーサルによって…*

セカンダリインデックス(インデックス#n)で見つかった行IDを含むスプールファイルが構築されます

  1. SMS(セット操作ステップ)を行います…*

UNION、MINUS、またはINTERSECT演算子を使用して行を結合します。

  1. ハッシュコードによってすべてのAMPに再配布されます。*

結合の準備のためにデータを再配布します。

  1. すべてのAMPで複製されます。*

結合の準備として、より小さなテーブルのデータを(SPOOLの観点から)複製します。

  1. (one_AMP)または(group_AMPs)*

すべてのAMPの代わりに1つのAMPまたはAMPのサブセットが使用されることを示します。

Teradata-ハッシュアルゴリズム

行は、プライマリインデックス値に基づいて特定のAMPに割り当てられます。 Teradataはハッシュアルゴリズムを使用して、行を取得するAMPを決定します。

以下は、ハッシュアルゴリズムの高レベルの図です。

ハッシュアルゴリズム

以下は、データを挿入する手順です。

  • クライアントはクエリを送信します。
  • パーサーはクエリを受信し、レコードのPI値をハッシュアルゴリズムに渡します。
  • ハッシュアルゴリズムはプライマリインデックス値をハッシュし、Row Hashと呼ばれる32ビットの数値を返します。
  • 行ハッシュの上位ビット(最初の16ビット)は、ハッシュマップエントリを識別するために使用されます。 ハッシュマップには1つのAMP#が含まれます。 ハッシュマップは、特定のAMP#を含むバケットの配列です。
  • BYNETは、識別されたAMPにデータを送信します。
  • AMPは32ビットの行ハッシュを使用して、ディスク内の行を特定します。
  • 同じ行ハッシュを持つレコードがある場合、32ビットの数値である一意性IDを増やします。 新しい行ハッシュの場合、一意性IDは1として割り当てられ、同じ行ハッシュを持つレコードが挿入されるたびに増分されます。
  • 行ハッシュと一意性IDの組み合わせは、行IDと呼ばれます。
  • 行IDは、ディスク内の各レコードの前に付けられます。
  • AMPの各テーブル行は、行IDによって論理的にソートされます。

テーブルの保存方法

テーブルは、行ID(行ハッシュと一意性ID)で並べ替えられ、AMP内に保存されます。 行IDは各データ行とともに保存されます。

Row Hash Uniqueness ID EmployeeNo FirstName LastName
2A01 2611 0000 0001 101 Mike James
2A01 2612 0000 0001 104 Alex Stuart
2A01 2613 0000 0001 102 Robert Williams
2A01 2614 0000 0001 105 Robert James
2A01 2615 0000 0001 103 Peter Paul

Teradata-ビュー

ビューは、クエリによって構築されるデータベースオブジェクトです。 ビューは、結合によって単一のテーブルまたは複数のテーブルを使用して構築できます。 定義はデータディクショナリに永続的に保存されますが、データのコピーは保存されません。 ビューのデータは動的に構築されます。

ビューには、テーブルの行のサブセットまたはテーブルの列のサブセットが含まれる場合があります。

ビューを作成する

ビューは、CREATE VIEWステートメントを使用して作成されます。

構文

ビューを作成するための構文は次のとおりです。

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

次のEmployeeテーブルを検討してください。

EmployeeNo FirstName LastName BirthDate
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テーブルにビューを作成します。

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

ビューを使用する

通常のSELECTステートメントを使用して、ビューからデータを取得できます。

次の例では、Employee_Viewからレコードを取得します。

SELECT EmployeeNo, FirstName, LastName FROM Employee_View;

上記のクエリを実行すると、次の出力が生成されます。

*** 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

ビューを変更する

既存のビューは、REPLACE VIEWステートメントを使用して変更できます。

ビューを変更する構文は次のとおりです。

REPLACE VIEW <viewname>
AS
<select query>;

次の例は、列を追加するためにEmployee_Viewビューを変更します。

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

ドロップビュー

既存のビューは、DROP VIEWステートメントを使用して削除できます。

構文

DROP VIEWの構文は次のとおりです。

DROP VIEW <viewname>;

次に、ビューEmployee_Viewをドロップする例を示します。

DROP VIEW Employee_View;

ビューの利点

  • ビューは、テーブルの行または列を制限することにより、セキュリティのレベルを追加します。
  • ユーザーには、ベーステーブルではなくビューへのアクセスのみを許可できます。
  • ビューを使用して事前に結合することにより、複数のテーブルの使用を簡素化します。

Teradata-マクロ

マクロは、マクロ名を呼び出して保存および実行されるSQLステートメントのセットです。 マクロの定義はデータディクショナリに保存されます。 ユーザーは、マクロを実行するためのEXEC権限のみが必要です。 ユーザーは、マクロ内で使用されるデータベースオブジェクトに対する個別の特権を必要としません。 マクロ文は単一のトランザクションとして実行されます。 マクロ内のSQLステートメントの1つが失敗すると、すべてのステートメントがロールバックされます。 マクロはパラメーターを受け入れることができます。 マクロにはDDLステートメントを含めることができますが、これはマクロの最後のステートメントでなければなりません。

マクロを作成する

マクロは、CREATE MACROステートメントを使用して作成されます。

構文

以下は、CREATE MACROコマンドの一般的な構文です。

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

次のEmployeeテーブルを検討してください。

EmployeeNo FirstName LastName BirthDate
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

次の例では、Get_Empというマクロを作成します。 従業員テーブルからレコードを取得するための選択ステートメントが含まれています。

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

マクロの実行

マクロはEXECコマンドを使用して実行されます。

構文

EXECUTE MACROコマンドの構文は次のとおりです。

EXEC <macroname>;

次の例は、Get_Empというマクロ名を実行します。次のコマンドを実行すると、従業員テーブルからすべてのレコードが取得されます。

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マクロはパラメーターを受け入れることができます。 マクロ内では、これらのパラメーターは;で参照されます。 (セミコロン)。

以下は、パラメーターを受け入れるマクロの例です。

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

パラメータ化されたマクロの実行

マクロはEXECコマンドを使用して実行されます。 マクロを実行するにはEXEC権限が必要です。

構文

EXECUTE MACROステートメントの構文は次のとおりです。

EXEC <macroname>(value);

次の例は、Get_Empというマクロ名を実行します。パラメーターとして従業員番号を受け入れ、その従業員の従業員テーブルからレコードを抽出します。

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

EmployeeNo      NetPay
-----------  ------------
   101           36000

Teradata-ストアドプロシージャ

ストアドプロシージャには、一連のSQLステートメントとプロシージャステートメントが含まれます。 手続き的なステートメントのみを含めることができます。 ストアドプロシージャの定義はデータベースに保存され、パラメータはデータディクショナリテーブルに保存されます。

利点

  • ストアドプロシージャにより、クライアントとサーバー間のネットワーク負荷が軽減されます。
  • 直接アクセスするのではなく、ストアドプロシージャを使用してデータにアクセスするため、セキュリティが向上します。
  • ビジネスロジックがテストされ、サーバーに保存されるため、メンテナンスが向上します。

作成手順

ストアドプロシージャは、CREATE PROCEDUREステートメントを使用して作成されます。

構文

以下は、CREATE PROCEDUREステートメントの一般的な構文です。

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

次の給与表を検討してください。

EmployeeNo Gross Deduction 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

次の例では、値を受け入れて給与テーブルに挿入するInsertSalaryという名前のストアドプロシージャを作成します。

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ステートメントを使用して実行されます。

構文

CALLステートメントの一般的な構文は次のとおりです。

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

次の例では、ストアドプロシージャInsertSalaryを呼び出し、Salary Tableにレコードを挿入します。

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

上記のクエリが実行されると、次の出力が生成され、Salaryテーブルに挿入された行が表示されます。

EmployeeNo Gross Deduction NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000
105 20,000 2,000 18,000

Teradata-JOIN戦略

この章では、Teradataで利用可能なさまざまなJOIN戦略について説明します。

結合方法

Teradataは、さまざまな結合方法を使用して結合操作を実行します。 一般的に使用されるいくつかの結合方法は次のとおりです-

  • 結合を結合
  • ネストされた結合
  • 製品結合

結合を結合

結合が等価条件に基づいている場合、結合結合メソッドが実行されます。 結合結合では、結合行が同じAMP上にある必要があります。 行は、行ハッシュに基づいて結合されます。 結合結合では、異なる結合戦略を使用して、同じAMPに行をもたらします。

戦略#1

結合列が対応するテーブルのプライマリインデックスである場合、結合行は既に同じ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);

これらの2つのテーブルがEmployeeNo列で結合されると、EmployeeNoは結合される両方のテーブルのプライマリインデックスであるため、再配布は行われません。

戦略#2

次のEmployeeテーブルとDepartmentテーブルを検討してください。

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

これら2つのテーブルがDeparmentNo列で結合されている場合、DepartmentNoは1つのテーブルのプライマリインデックスであり、別のテーブルの非プライマリインデックスであるため、行を再分散する必要があります。 このシナリオでは、行の結合が同じAMP上にない場合があります。 このような場合、TeradataはDepartmentNo列で従業員テーブルを再配布する場合があります。

戦略#3

上記のEmployeeテーブルとDepartmentテーブルでは、Departmentテーブルのサイズが小さい場合、TeradataはすべてのAMPでDepartmentテーブルを複製できます。

ネストされた結合

ネストされた結合はすべてのAMPを使用するわけではありません。 ネストされた結合を実行するには、1つのテーブルの一意のプライマリインデックスの条件が1つで、この列を他のテーブルのインデックスに結合する必要があります。

このシナリオでは、システムは1つのテーブルの一意のプライマリインデックスを使用して1つの行をフェッチし、その行ハッシュを使用して他のテーブルから一致するレコードをフェッチします。 ネストされた結合は、すべてのJoinメソッドの中で最も効率的です。

製品結合

製品結合は、1つのテーブルからの各適格行を他のテーブルからの各適格行と比較します。 製品の結合は、次の要因のいくつかのために行われる場合があります-

  • 条件が欠落している場所。
  • 結合条件は等価条件に基づいていません。
  • テーブルのエイリアスが正しくありません。
  • 複数の結合条件。

Teradata-OLAP関数

OLAP関数は集計関数に似ていますが、集計関数は値を1つだけ返すのに対して、OLAP関数は集計に加えて個々の行を提供します。

構文

以下は、OLAP関数の一般的な構文です。

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

集計関数には、SUM、COUNT、MAX、MIN、AVGがあります。

次の給与表を検討してください。

EmployeeNo Gross Deduction 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;

上記のクエリを実行すると、次の出力が生成されます。

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

RANK

RANK関数は、指定された列に基づいてレコードを順序付けます。 RANK関数は、ランクに基づいて返されるレコードの数をフィルタリングすることもできます。

構文

RANK関数を使用するための一般的な構文は次のとおりです。

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

次のEmployeeテーブルを検討してください。

EmployeeNo FirstName LastName JoinedDate DepartmentID BirthDate
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

次のクエリは、Joined Dateによって従業員テーブルのレコードを並べ、Joined Dateにランキングを割り当てます。

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

上記のクエリを実行すると、次の出力が生成されます。

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句で定義された列でデータをグループ化し、各グループ内でOLAP機能を実行します。 以下は、PARTITION BY句を使用するクエリの例です。

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

上記のクエリを実行すると、次の出力が生成されます。 各部門のランクがリセットされていることがわかります。

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-データ保護

この章では、Teradataのデータ保護に使用できる機能について説明します。

トランジェントジャーナル

TeradataはTransient Journalを使用して、トランザクション障害からデータを保護します。 トランザクションが実行されるたびに、トランジェントジャーナルは、トランザクションが成功するかロールバックが成功するまで、影響を受ける行の変更前イメージのコピーを保持します。 その後、変更前イメージは破棄されます。 一時ジャーナルは各AMPに保持されます。 これは自動プロセスであり、無効にすることはできません。

後退する

フォールバックは、フォールバックAMPと呼ばれる別のAMPにテーブルの行の2番目のコピーを保存することにより、テーブルデータを保護します。 1つのAMPが失敗すると、フォールバック行にアクセスします。 これにより、1つのAMPに障害が発生した場合でも、フォールバックAMPを介してデータを利用できます。 フォールバックオプションは、テーブル作成時またはテーブル作成後に使用できます。 フォールバックにより、テーブルの行の2番目のコピーが常に別のAMPに保存され、AMPの障害からデータが保護されます。 ただし、フォールバックは、挿入/削除/更新のストレージとI/Oの2倍を占有します。

次の図は、行のフォールバックコピーが別のAMPに保存される方法を示しています。

フォールバック

ダウンAMP回復ジャーナル

AMPが失敗し、テーブルがフォールバック保護されると、ダウンAMP回復ジャーナルがアクティブになります。 このジャーナルは、失敗したAMPのデータに対するすべての変更を追跡します。 ジャーナルは、クラスター内の残りのAMPでアクティブ化されます。 これは自動プロセスであり、無効にすることはできません。 失敗したAMPがライブになると、ダウンAMPリカバリジャーナルからのデータはAMPと同期されます。 これが完了すると、ジャーナルは破棄されます。

Down AMP Recovery Journal

クリーク

クリークは、ノードの障害からデータを保護するためにTeradataが使用するメカニズムです。 クリークは、ディスクアレイの共通セットを共有するTeradataノードのセットにすぎません。 ノードに障害が発生すると、障害が発生したノードのvprocはクリーク内の他のノードに移行し、ディスクアレイへのアクセスを継続します。

ホットスタンバイノード

ホットスタンバイノードは、運用環境に参加しないノードです。 ノードに障害が発生すると、障害が発生したノードのvprocはホットスタンバイノードに移行します。 障害が発生したノードが回復すると、ホットスタンバイノードになります。 ホットスタンバイノードは、ノードに障害が発生した場合にパフォーマンスを維持するために使用されます。

RAID

独立ディスクの冗長アレイ(RAID)は、ディスク障害からデータを保護するために使用されるメカニズムです。 ディスクアレイは、論理ユニットとしてグループ化された一連のディスクで構成されます。 このユニットは、ユーザーには単一のユニットのように見えますが、複数のディスクに分散している場合があります。

RAID 1は、Teradataで一般的に使用されています。 RAID 1では、各ディスクはミラーディスクに関連付けられています。 プライマリディスクのデータに対する変更は、ミラーコピーにも反映されます。 プライマリディスクに障害が発生した場合、ミラーディスクのデータにアクセスできます。

RAID

Teradata-ユーザー管理

この章では、Teradataでのユーザー管理のさまざまな戦略について説明しました。

ユーザー

ユーザーは、CREATE USERコマンドを使用して作成されます。 Teradataでは、ユーザーもデータベースに似ています。 どちらにもスペースを割り当てることができ、ユーザーにパスワードが割り当てられている場合を除き、データベースオブジェクトを含めることができます。

構文

CREATE USERの構文は次のとおりです。

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

ユーザーを作成する際、ユーザー名、永続スペース、およびパスワードの値は必須です。 他のフィールドはオプションです。

以下は、ユーザーTD01を作成する例です。

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

アカウント

新しいユーザーの作成中に、ユーザーがアカウントに割り当てられる場合があります。 CREATE USERのACCOUNTオプションは、アカウントを割り当てるために使用されます。 ユーザーは複数のアカウントに割り当てられる場合があります。

構文

アカウントオプション付きのCREATE USERの構文は次のとおりです。

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

次の例では、ユーザーTD02を作成し、アカウントをITおよびAdminとして割り当てます。

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

ユーザーは、Teradataシステムにログインするとき、またはSET SESSIONコマンドを使用してシステムにログインした後に、アカウントIDを指定できます。

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

特権を付与する

GRANTコマンドは、データベースオブジェクトに対する1つ以上の特権をユーザーまたはデータベースに割り当てるために使用されます。

構文

GRANTコマンドの構文は次のとおりです。

GRANT privileges ON objectname TO username;

特権には、INSERT、SELECT、UPDATE、REFERENCESがあります。

以下はGRANTステートメントの例です。

GRANT SELECT,INSERT,UPDATE ON Employee TO TD01;

特権を取り消す

REVOKEコマンドは、ユーザーまたはデータベースから特権を削除します。 REVOKEコマンドは、明示的な特権のみを削除できます。

構文

REVOKEコマンドの基本的な構文は次のとおりです。

REVOKE [ALL|privileges] ON objectname FROM username;

次に、REVOKEコマンドの例を示します。

REVOKE INSERT,SELECT ON Employee FROM TD01;

Teradata-パフォーマンスチューニング

この章では、Teradataのパフォーマンスチューニングの手順について説明します。

説明する

パフォーマンスチューニングの最初のステップは、クエリでEXPLAINを使用することです。 EXPLAINプランは、オプティマイザーがクエリを実行する方法の詳細を提供します。 説明計画で、信頼レベル、使用される結合戦略、スプールファイルサイズ、再配布などのキーワードを確認します。

統計を収集する

オプティマイザーはデータ人口統計を使用して、効果的な実行戦略を考え出します。 COLLECT STATISTICSコマンドは、テーブルのデータ人口統計を収集するために使用されます。 列で収集された統計が最新であることを確認してください。

  • WHERE句で使用される列と、結合条件で使用される列の統計を収集します。
  • Unique Primary Index列の統計を収集します。
  • Non Unique Secondary Index列の統計を収集します。 オプティマイザーは、NUSIまたは全表スキャンを使用できるかどうかを決定します。
  • 基本テーブルの統計は収集されますが、結合インデックスの統計を収集します。
  • パーティション化列の統計を収集します。

データ型

適切なデータ型が使用されていることを確認してください。 これにより、必要以上のストレージの使用が回避されます。

変換

明示的なデータ変換を回避するために、結合条件で使用される列のデータ型に互換性があることを確認してください。

Sort

不要な場合は、不要なORDER BY句を削除してください。

スプールスペースの問題

クエリがそのユーザーのAMPスプールスペース制限ごとに超過すると、スプールスペースエラーが生成されます。 EXPLAIN PLANを確認し、より多くのスプール領域を消費するステップを特定します。 これらの中間クエリを分割して個別に配置し、一時テーブルを構築できます。

一次インデックス

プライマリインデックスがテーブルに対して正しく定義されていることを確認してください。 プライマリインデックス列は、データを均等に分散し、データへのアクセスに頻繁に使用する必要があります。

SETテーブル

SETテーブルを定義すると、オプティマイザーは、挿入されたすべてのレコードに対してレコードが重複しているかどうかを確認します。 重複チェック条件を削除するには、テーブルに一意のセカンダリインデックスを定義できます。

大きなテーブルの更新

大きなテーブルの更新には時間がかかります。 テーブルを更新する代わりに、レコードを削除し、変更された行を含むレコードを挿入できます。

一時テーブルの削除

一時テーブル(ステージングテーブル)とvolatileが不要になったら削除します。 これにより、永続的なスペースとスプールスペースが解放されます。

MULTISETテーブル

入力レコードに重複レコードがないことが確実な場合は、ターゲット表をMULTISET表として定義して、SET表で使用される重複行チェックを回避できます。

Teradata-FastLoad

FastLoadユーティリティは、空のテーブルにデータをロードするために使用されます。 一時的なジャーナルを使用しないため、データをすばやく読み込むことができます。 ターゲット表がMULTISET表であっても、重複する行はロードされません。

制限

ターゲットテーブルには、セカンダリインデックス、結合インデックス、および外部キー参照を含めることはできません。

FastLoadの仕組み

FastLoadは2つのフェーズで実行されます。

フェーズ1

  • 解析エンジンは入力ファイルからレコードを読み取り、各AMPにブロックを送信します。
  • 各AMPはレコードのブロックを保存します。
  • 次に、AMPは各レコードをハッシュし、正しいAMPに再配布します。
  • フェーズ1の終わりに、各AMPには行がありますが、行ハッシュシーケンスではありません。

フェーズ2

  • FastLoadがEND LOADINGステートメントを受け取ると、フェーズ2が始まります。
  • 各AMPは行ハッシュのレコードをソートし、ディスクに書き込みます。
  • ターゲットテーブルのロックが解除され、エラーテーブルが削除されます。

次のレコードを含むテキストファイルを作成し、ファイルに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

上記のファイルをEmployee_StgテーブルにロードするサンプルFastLoadスクリプトを次に示します。

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

FastLoadスクリプトの実行

入力ファイルemployee.txtが作成され、FastLoadスクリプトの名前がEmployeeLoad.flになったら、UNIXおよびWindowsで次のコマンドを使用してFastLoadスクリプトを実行できます。

FastLoad < EmployeeLoad.fl;

上記のコマンドが実行されると、FastLoadスクリプトが実行され、ログが生成されます。 ログでは、FastLoadによって処理されたレコードの数とステータスコードを確認できます。

**** 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の条件

以下は、FastLoadスクリプトで使用される一般的な用語のリストです。

  • LOGON -Teradataにログインし、1つ以上のセッションを開始します。
  • DATABASE -デフォルトのデータベースを設定します。
  • BEGIN LOADING -ロードするテーブルを識別します。
  • ERRORFILES -作成/更新する必要がある2つのエラーテーブルを識別します。
  • CHECKPOINT -チェックポイントを取るタイミングを定義します。
  • SET RECORD -入力ファイル形式がフォーマットされているか、バイナリ、テキスト、またはフォーマットされていないかを指定します。
  • DEFINE -入力ファイルのレイアウトを定義します。
  • FILE -入力ファイル名とパスを指定します。
  • INSERT -入力ファイルのレコードをターゲットテーブルに挿入します。
  • ロードの終了-FastLoadのフェーズ2を開始します。 レコードをターゲットテーブルに分散します。
  • LOGOFF -すべてのセッションを終了し、FastLoadを終了します。

Teradata-MultiLoad

MultiLoadは一度に複数のテーブルをロードでき、INSERT、DELETE、UPDATE、UPSERTなどのさまざまなタイプのタスクも実行できます。 一度に最大5つのテーブルをロードし、スクリプトで最大20のDML操作を実行できます。 MultiLoadにはターゲットテーブルは必要ありません。

MultiLoadは2つのモードをサポートしています-

  • インポート
  • DELETE

MultiLoadには、ターゲットテーブルに加えて、作業テーブル、ログテーブル、および2つのエラーテーブルが必要です。

  • ログテーブル-再起動に使用されるロード中に取得されたチェックポイントを維持するために使用されます。
  • エラーテーブル-これらのテーブルは、エラー発生時にロード中に挿入されます。 最初のエラーテーブルには変換エラーが格納され、2番目のエラーテーブルには重複レコードが格納されます。
  • ログテーブル-MultiLoadの各フェーズの結果を再起動のために維持します。
  • 作業テーブル-MultiLoadスクリプトは、ターゲットテーブルごとに1つの作業テーブルを作成します。 作業テーブルは、DMLタスクと入力データを保持するために使用されます。

制限

MultiLoadにはいくつかの制限があります。

  • 一意のセカンダリインデックスはターゲットテーブルでサポートされていません。
  • 参照整合性はサポートされていません。
  • トリガーはサポートされていません。

MultiLoadの仕組み

MultiLoadインポートには5つのフェーズがあります-

  • *フェーズ1 *-予備フェーズ-基本的なセットアップアクティビティを実行します。
  • *フェーズ2 *-DMLトランザクションフェーズ-DMLステートメントの構文を検証し、Teradataシステムに取り込みます。
  • *フェーズ3 *-取得フェーズ-入力データを作業テーブルに取り込み、テーブルをロックします。
  • *フェーズ4 *-アプリケーションフェーズ-すべてのDML操作を適用します。
  • *フェーズ5 *-クリーンアップフェーズ-テーブルのロックを解除します。

MultiLoadスクリプトに含まれる手順は次のとおりです-

  • *ステップ1 *-ログテーブルを設定します。
  • *ステップ2 *-Teradataにログオンします。
  • *ステップ3 *-ターゲット、ワーク、エラーテーブルを指定します。
  • *ステップ4 *-INPUTファイルレイアウトを定義します。
  • *ステップ5 *-DMLクエリを定義します。
  • *ステップ6 *-IMPORTファイルに名前を付けます。
  • *ステップ7 *-使用するレイアウトを指定します。
  • *ステップ8 *-ロードを開始します。
  • *ステップ9 *-ロードを終了し、セッションを終了します。

次のレコードを含むテキストファイルを作成し、ファイルに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

次の例は、従業員テーブルからレコードを読み取り、Employee_StgテーブルにロードするMultiLoadスクリプトです。

.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.txtが作成され、マルチロードスクリプトの名前がEmployeeLoad.mlになったら、UNIXおよびWindowsで次のコマンドを使用してマルチロードスクリプトを実行できます。

Multiload < EmployeeLoad.ml;

Teradata-FastExport

FastExportユーティリティは、Teradataテーブルからフラットファイルにデータをエクスポートするために使用されます。 レポート形式でデータを生成することもできます。 Joinを使用して、1つ以上のテーブルからデータを抽出できます。 FastExportはデータを64Kブロックでエクスポートするため、大量のデータを抽出するのに役立ちます。

次のEmployeeテーブルを検討してください。

EmployeeNo FirstName LastName BirthDate
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スクリプトの例を次に示します。 従業員テーブルからデータをエクスポートし、ファイル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;

FastExportスクリプトの実行

スクリプトを作成してemployee.fxという名前を付けたら、次のコマンドを使用してスクリプトを実行できます。

fexp < employee.fx

上記のコマンドを実行すると、ファイルemployeedata.txtに次の出力が表示されます。

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

FastExportの条件

以下は、FastExportスクリプトで一般的に使用される用語のリストです。

  • LOGTABLE -再起動のためにログテーブルを指定します。
  • LOGON -Teradataにログインし、1つ以上のセッションを開始します。
  • DATABASE -デフォルトのデータベースを設定します。
  • BEGIN EXPORT -エクスポートの開始を示します。
  • EXPORT -ターゲットファイルとエクスポート形式を指定します。
  • SELECT -データをエクスポートする選択クエリを指定します。
  • END EXPORT -FastExportの終了を指定します。
  • LOGOFF -すべてのセッションを終了し、FastExportを終了します。

Teradata-BTEQ

BTEQユーティリティは、Teradataの強力なユーティリティであり、バッチモードとインタラクティブモードの両方で使用できます。 DDLステートメント、DMLステートメントの実行、マクロおよびストアドプロシージャの作成に使用できます。 BTEQは、フラットファイルからTeradataテーブルにデータをインポートするために使用でき、テーブルからファイルまたはレポートにデータを抽出するためにも使用できます。

BTEQ用語

以下は、BTEQスクリプトで一般的に使用される用語のリストです。

  • LOGON -Teradataシステムにログインするために使用されます。
  • ACTIVITYCOUNT -前のクエリによって影響を受けた行の数を返します。
  • ERRORCODE -前のクエリのステータスコードを返します。
  • DATABASE -デフォルトのデータベースを設定します。
  • LABEL -一連のSQLコマンドにラベルを割り当てます。
  • RUN FILE -ファイルに含まれるクエリを実行します。
  • GOTO -コントロールをラベルに転送します。
  • LOGOFF -データベースからログオフし、すべてのセッションを終了します。
  • 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;

上記のスクリプトは、次のタスクを実行します。

  • Teradata Systemにログインします。
  • デフォルトのデータベースを設定します。
  • employee_bkupというテーブルを作成します。
  • Employeeテーブルから1つのレコードを選択して、テーブルにレコードがあるかどうかを確認します。
  • テーブルが空の場合、employee_bkupテーブルを削除します。
  • レコードをemployee_bkupテーブルに挿入するLabel InsertEmployeeにコントロールを転送します
  • ERRORCODEをチェックして、各SQLステートメントに続いて、ステートメントが成功したことを確認します。
  • ACTIVITYCOUNTは、前のSQLクエリによって選択/影響を受けたレコードの数を返します。

Teradata-questions-answers