0% found this document useful (0 votes)
35 views

TD Practical Notes

The document describes creating a database and table in Teradata. It then inserts sample data into the table. Various indexes are created and explained. Queries are run against the table and explained.

Uploaded by

K Vinay Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
35 views

TD Practical Notes

The document describes creating a database and table in Teradata. It then inserts sample data into the table. Various indexes are created and explained. Queries are run against the table and explained.

Uploaded by

K Vinay Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 6

CREATE DATABASE vkumara FROM dbc

AS
PERM = 5368709120, -- 5GB
SPOOL = 5368709120, -- 5GB
TEMPORARY = 2147483648 -- 2GB
NO FALLBACK
NO BEFORE JOURNAL
NO AFTER JOURNAL;

show table vkumara.STUDENT ;

CREATE TABLE VKUMARA.STUDENT


(ROLL_NO INTEGER
,FIRST_NAME VARCHAR(50)
,LAST_NAME VARCHAR(50)
,CONTACT_NO INTEGER)
PRIMARY INDEX (ROLL_NO);

CREATE MULTISET TABLE vkumara.STUDENT ,FALLBACK ,


NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO,
MAP = TD_MAP1
(
ROLL_NO INTEGER,
FIRST_NAME VARCHAR(50) CHARACTER SET LATIN CASESPECIFIC,
LAST_NAME VARCHAR(50) CHARACTER SET LATIN CASESPECIFIC,
CONTACT_NO INTEGER)
PRIMARY INDEX ( ROLL_NO )
UNIQUE INDEX ( CONTACT_NO );

CREATE MULTISET TABLE vkumara.STUDENT ,FALLBACK ,


NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO,
MAP = TD_MAP1
(
ROLL_NO INTEGER,
FIRST_NAME VARCHAR(50) CHARACTER SET LATIN CASESPECIFIC,
LAST_NAME VARCHAR(50) CHARACTER SET LATIN CASESPECIFIC,
CONTACT_NO INTEGER)
PRIMARY INDEX ( ROLL_NO ) ---NUPI
UNIQUE INDEX ( CONTACT_NO ) --USI
INDEX ( LAST_NAME ); --NUSI

INSERT INTO VKUMARA.STUDENT(ROLL_NO,FIRST_NAME,LAST_NAME,CONTACT_NO) VALUES


(456321,'JACK ','PHIL ',02245875);
INSERT INTO VKUMARA.STUDENT(ROLL_NO,FIRST_NAME,LAST_NAME,CONTACT_NO) VALUES
(456356,'ABHISHEK ','PATIL ',02214528);
INSERT INTO VKUMARA.STUDENT(ROLL_NO,FIRST_NAME,LAST_NAME,CONTACT_NO) VALUES
(456459,'JAY ','SHARMA ',02259637);
INSERT INTO VKUMARA.STUDENT(ROLL_NO,FIRST_NAME,LAST_NAME,CONTACT_NO) VALUES
(456857,'SAGAR ','SHARMA ',02287254);
select * from VKUMARA.STUDENT;

create unique index(contact_no) on VKUMARA.STUDENT;

create index(LAST_NAME) on VKUMARA.STUDENT;

drop unique index(contact_no) on VKUMARA.STUDENT;

explain SELECT * FROM vkumara.student where Contact_No = 02245875; --USI

Explanation
------------------------------------------------------------------------
1) First, we do a two-AMP RETRIEVE step in TD_MAP1 from
vkumara.student by way of unique index # 4
"vkumara.student.CONTACT_NO = 2245875" with no residual conditions.
The estimated time for this step is 0.00 seconds.
-> The row is sent directly back to the user as the result of
statement 1. The total estimated time is 0.00 seconds.

explain SELECT * FROM vkumara.student where LAST_NAME = 'PATIL'; --NUSI

Explanation
-----------------------------------------------------------------------
1) First, we lock vkumara.student in TD_MAP1 for read on a reserved
RowHash to prevent global deadlock.
2) Next, we lock vkumara.student in TD_MAP1 for read.
3) We do an all-AMPs RETRIEVE step in TD_MAP1 from vkumara.student by
way of an all-rows scan with a condition of (
"vkumara.student.LAST_NAME = 'PATIL'") 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 (198 bytes). The
estimated time for this step is 0.00 seconds.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.00 seconds.

explain SELECT * FROM vkumara.student where ROLL_NO = 456321;


explain SELECT * FROM vkumara.student where ROLL_NO = 456321; --UPI

Explanation
-----------------------------------------------------------------------
1) First, we do a single-AMP RETRIEVE step from vkumara.student by
way of the primary index "vkumara.student.ROLL_NO = 456321" 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 (198 bytes). The estimated time for this
step is 0.00 seconds.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.00 seconds.

CREATE MULTISET TABLE VKUMARA.PRODUCT_TABLE ,FALLBACK ,


NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO,
MAP = TD_MAP1
(
ORDER_NO INTEGER NOT NULL,
CUST_NO INTEGER,
PRODUCT VARCHAR(20) CHARACTER SET LATIN CASESPECIFIC,
ORDER_DATE DATE FORMAT 'YYyy-MM-DD',
AREA VARCHAR(50) CHARACTER SET LATIN CASESPECIFIC,
ORDER_COST DECIMAL(10,2))
PRIMARY INDEX ( ORDER_NO )
PARTITION BY RANGE_N(ORDER_DATE BETWEEN DATE '2015-01-01' AND DATE '2015-
12-31' EACH INTERVAL '7' DAY );

INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (1,1150,'APPLE' ,'2015-09-


01','7,CROSS HILL' ,1000);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (2,1160,'MANGO' ,'2015-09-
03','1,PARK STREET' ,2000);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (3,1170,'GRAPES' ,'2015-09-
10','MELBOURNE' ,3000);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (4,1180,'BANANAS','2015-09-
18','ALFRED STREET' ,2000);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (5,1250,'MANGO' ,'2015-09-
08','DUNGATE LANE' ,7000);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (6,1260,'GRAPES' ,'2015-10-
11','TEMPER LANE' ,1200);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (7,1270,'APPLE' ,'2015-10-
17','HARBOUR STREET',3200);
INSERT INTO VKUMARA.PRODUCT_TABLE VALUES (8,1290,'BANANAS','2015-10-
30','1,PARK STREET' ,6700);

explain select * from VKUMARA.PRODUCT_TABLE where order_date='2015-09-01';

Explanation
-----------------------------------------------------------------------
1) First, we lock VKUMARA.PRODUCT_TABLE in TD_MAP1 for read on a
reserved RowHash in a single partition to prevent global deadlock.
2) Next, we lock VKUMARA.PRODUCT_TABLE in TD_MAP1 for read on a
single partition.
3) We do an all-AMPs RETRIEVE step in TD_MAP1 from a single partition
of VKUMARA.PRODUCT_TABLE with a condition of (
"VKUMARA.PRODUCT_TABLE.ORDER_DATE = DATE '2015-09-01'") with a
residual condition of ("VKUMARA.PRODUCT_TABLE.ORDER_DATE = DATE
'2015-09-01'") into Spool 1 (group_amps), which is built locally
on the AMPs. The size of Spool 1 is estimated with low confidence
to be 1 row (91 bytes). The estimated time for this step is 0.00
seconds.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.00 seconds.

Duplicate error in case of UPI table:


Executed as Single statement. Failed [2801 : 23000] Duplicate unique prime key error in
vkumara.sample_1.
Elapsed time = 00:00:00.066

SELECT RANGE_N(ORDER_DATE BETWEEN date '2015-01-01' AND DATE '2015-12-31'


EACH INTERVAL '7' DAY , NO RANGE OR UNKNOWN ) AS Partition#,ORDER_DATE FROM
VKUMARA.PRODUCT_TABLE;

select * FROM VKUMARA.PRODUCT_TABLE where Partition=35;


Example 3: Checking data distribution of given columns on the AMP
SELECT HASHAMP(HASHBUCKET(HASHROW([columnlist]))),COUNT(*) FROM
[databasename].[tablename]
GROUP BY 1 ORDER BY 2 DESC;

Example 4: Storage of a table for each AMP


SELECT vproc, CurrentPerm
FROM DBC.TableSize
WHERE DatabaseName = '[databasename]'
AND TableName = '[tablename]'
ORDER BY 1;

Example 5: Skewness of a table


SELECT TableName,SUM(CurrentPerm) AS CurrentPerm,SUM(PeakPerm) AS
PeakPerm,
CAST((100 - (AVG(CurrentPerm)/MAX(CurrentPerm)*100)) AS INTEGER)
AS SkewFactor
FROM DBC.TableSize
WHERE DatabaseName='[databasename]'
AND TableName= '[tablename]'
GROUP BY 1;

Note: If table is more skewed then user may get "no more room in database" error
while inserting data even if there is space available. This is because of HOT AMP
i.e. there is uneven distribution of data and more data is going to single amp which
does not have enough space to handle all data.

Query to find user access and roles in Teradata


To find user access we need to query on DBC.ROLEMEMBERS and
DBC.ALLROLERIGHTS. Both are system tables and your user id (through which
you login in Teradata) must have access to query on these tables. You can easily
check that by doing –
 SELECT * FROM DBC.ROLEMEMBERS
 SELECT * FROM DBC.ALLROLERIGHTS

SELECT
A.ROLENAME,
A.GRANTEE AS USER_ID,
A.GRANTOR AS ADMIN_ID,
B.DATABASENAME,
B.TABLENAME,
B.GRANTORNAME,
B.ACCESSRIGHT
FROM    DBC.ROLEMEMBERS A
JOIN    DBC.ALLROLERIGHTS B
ON  A.ROLENAME = B.ROLENAME
WHERE  GRANTEE=’give_user_id_here‘
GROUP BY 1,2,3,4,5,6,7
ORDER BY 2,1,6;

Teradata Utilities:
Export

1. .EXPORT DATA FILE  in native bytes format


2. .EXPORT REPORT FILE  readable .txt files
3. .EXPORT INDICDATA FILE  in native bytes format with NULL indicator
4. .EXPORT DIF FILE  Data Interchange Format , into .csv format
SELECT *
FROM TABLE (STRTOK_SPLIT_TO_TABLE('string1', 'A,B,C,D,E', ',')
RETURNS (outkey VARCHAR(10) CHARACTER SET UNICODE
,tokennum INTEGER
,token VARCHAR(30) CHARACTER SET UNICODE)
) AS dt;

string1 ,1, A
string1 ,2, B
string1 ,3, C
string1 ,4, D
string1 ,5, E

You might also like