22 December 2009

Informix: วิธีการเช็คว่า table or partition ถูก compress หรือยัง

1. Execute function estimate run on sysadmin database
execute function task ("table estimate_compression", "[Tabname]", "[Dbname]" , "[Owner]");
example

Informix: วิธีการ compress table

ข้อควรรู้ก่อนทำ Table Compression
  1. สำหรับ user ที่จะใช้ในการรัน compression นั้นต้องเป็น informix 
  2. ต้องรันที่ sysadmin database 
  3. database server ต้องเป็น informix version 11.50 ด้วย
  4. table หรือ partition on table ที่จะ Compress ต้องมีข้อมูลมากกว่า 2000 row และ update statistics แล้ว
  5. ไม่สามารถ compress  temp table 
  6. ไม่สามารถ compress  index
  7. ไม่สามารถ compress  กับ system database
ขั้นตอนการทำ Table Compression

1. login ด้วย user "informix" เข้า database "sysadmin"


16 October 2009

Informix: Cannot rename table

ถ้าจะ rename table ด้วยคำสั่ง
rename table table_A to table_B;
แล้วมันขึ้น error ว่า
242: Could not open database table (table_A).
197: ISAM error:  Partition recently appended to; can't open for write or l
สาเหตุ
onpload แล้วยังไม่ได้ backup database

วิธีแก้ไข
ontape -s ด้วย user informix

07 October 2009

Awk: Random number

Put random number into every line of data
awk 'BEGIN{srand()} {RAND=1+int(rand()*1000000); print RAND}' [file]

22 September 2009

Informix: What tables is in each dbspace?

SQL บน Informix ที่ไว้หาว่าแต่ละ dbspace มี table อะไรอาศัยอยู่บ้าง

dbaccess {dbname}
select
dbinfo( "DBSPACE" , pe_partnum ) :: char(10) as dbspace
,b.dbsname[1,10] dbsname
,b.tabname[1,30] objname
,case when c.tabid is null then 'i' else 't' end as objtp
from
sysmaster@{instancename}:sysptnext a
, sysmaster@{instancename}:systabnames b
, outer {dbname}@{instancename}:systables c
where
a.pe_partnum = b.partnum
and b.tabname = c.tabname
and b.tabname not like 'sys%'
and b.dbsname='{dbname}'
and dbinfo( "DBSPACE" , pe_partnum ) :: char(10) = '{dbspacename}'
group by 1,2,3,4
order by 1,2,3,4;

14 September 2009

Informix: Left Outer Join

เพิ่งรู้ว่า
select a.key1, a.key2
,sum(col_1)::int
from TabA a left outer join TabB b
on a.cust_numb = b.cust_numb
and a.subr_numb = b.subr_numb
and b.data_dt = '2009-01-01'
and a.store_cd = 'STORE1'
group by 1,2
นอกจากจะช้านรกแล้ว ยังให้ผลลัพธ์ผิดอีกด้วย ผลลัพธ์ที่ได้จะมี store_cd อื่นๆ นอกเหนือจาก STORE1 ปนมาด้วย ถ้าอยากให้ถูกต้อง ต้องเขียนแบบนี้
select a.key1, a.key2
,sum(col_1)::int
from TabA a, outer TabB b
where a.key1 = b.key1
and a.key2 = b.key2
and b.data_dt = '2009-01-01'
and a.store_cd = 'STORE1'
group by 1,2
ว่างๆ จะหาเหตุผลว่า ทำไม query แรกมันถึงผิด?

25 August 2009

Informix: update statistics

หลังจาก create table เสร็จแล้ว ให้ load data เข้าไปก่อนแล้วค่อย create index เพราะการมี index อยู่ทำให้ load data ไป build index ไปช้าลง

เมื่อ load data เสร็จให้ upstat low ให้รู้ว่าตอนนี้ table มี record แล้ว ตอน built index มันจะได้ฉลาดขึ้น

หลังจาก build index เสร็จให้ upstat medium ทุก column แล้วค่อย upstat high column ที่เป็น index
update statistics medium for table {tabname} ; 
create unique index {tabname}_p01 on {tabname} (column list) ;
create index {tabname}_i02 on {tabname} (column list) ; 
update statistics high for table {tabname} (column list on primary key) ;

10 August 2009

Informix: update from another table

update tabA
set tabA.col1 = (select tabB.col1
from tabB
where tabA.key1 = tabB.key1
and tabA.key2 = tabB.key2
and tabB.col2 = '2009-06-01')

20 July 2009

Informix: Size ของแต่ละ Data Type

Integer = 4 byte
Date/Timestamp = 4 byte

You can use the following formulas (rounded down to a whole number of bytes) to calculate the byte storage (N) for a DECIMAL(p,s) data type (where N includes the byte that is required to store the exponent and the sign):

If the scale is odd: N = (precision + 4) / 2
If the scale is even: N = (precision + 3) / 2

Reference
http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlr.doc/sqlrmst111.htm

17 July 2009

Informix: HPL command

HPL หรือ High Performance Loader คือเครื่องมือของ Informix เพื่อใช้ในการ load text file เข้า table และ/หรือ unload data ออกจาก table เป็น text file สามารถเลือกทำกับ table เดียวหรือหลาย table ก็ได้ ทำทั้ง table หรือใส่เงื่อนไข filter (where condition) เข้าไปก็ได้ เลือกทุก column หรือเอาเฉพาะบาง column ก็ได้

ขั้นตอนเป็นดังนี้
1. check environment
env | grep DBONPLOAD หากยังไม่มีก็ทำการ Set environment โดย
export DBONPLOAD=[hpl_dbname]
2. Create HPL project  ขั้นตอนนี้ทำครั้งเดียว
onpladm create project [project name]
3. Configure HPL project ขั้นตอนนี้ทำครั้งเดียว
onpladm configure defaults –m [machine type] –c [data code set]
ตัวอย่างเช่น 
onpladm configure default –m Sparcstation –c thai6

4. Create job
onpladm create job [job name] –p [project name] –d [path of file] –D [database name] –t [table name]
5. Execute job
onpload –p [project name] –j [job name] –f [u or l]
โดยที่ u : unload, l : load
6. Check process
tail –f /tmp/[job name].log
แถมวิธีการลบ job
onpladm delete job [job name] -p [project name] -R

07 July 2009

Teradata: Ceil() equivalent function

Ceil() เป็น function บน Oracle ใช้สำหรับปัดตัวเลขขึ้นเสมอ แต่บน TD ไม่มีคำสั่งนี้
บน TD ในกรณีที่ต้องการปัดเลขทศนิยมขึ้นเป็น Integer เสมอ ใช้คำสั่ง
SELECT cast((col1) as int) + (case when (col1) mod 1 > 0 then 1 else 0 end);

30 June 2009

Teradata: Basic Command

1.
โดยปกติแล้ว เวลาจะอ้างชื่อ table ใน TD เราต้องอ้างชื่อเต็มคือ [dbname].[tablename] แต่เราสามารถกำหนด default database ได้ ช่วยให้ไม่ต้องกำหนดชื่อ db ใน query
DATABASE [dbname];
2.
อยากรู้ว่า table นั้นมี column อะไรบ้าง กรณีที่เป็น view เราจะเห็นแค่ชื่อ column เท่านั้นไม่สามารถเห็น data type ได้
HELP TABLE [tablename];
3.
แปลง timestamp เป็น date
[columnname] (date, format'yyyy-mm-dd')

20 May 2009

DataStage: Merge data เติมข้อมูลฟันหลอ

ปัญหา
มีข้อมูลฟันหลออยู่หลายๆบรรทัด ยุบรวมให้เป็น record เดียวตาม key ที่กำหนด

ตัวอย่างข้อมูล
key,aaa,bbb
111,a11,null
111,null,b11
222,a22,null
222,null,b22

ตัวอย่างผลลัพธ์ที่ต้องการ
key,aaa,bbb
111,a11,b11
222,a22,b22

วิธีทำ






1. filter แยกเป็น 2 ส่วน ส่วนแรกเลือกเอาที่ aaa มีค่า ส่วนที่ 2 เลือกเอาที่ bbb มีค่า




2. ตัดข้อมูลส่วนแรกให้เหลือ 2 column คือ key และ aaa พร้อมเปลี่ยนชื่อ column ผ่าน copy stage
จากรูปจะเห็นว่า เราไม่เอา column bbb ไปด้วย




3. ตัดข้อมูลส่วนที่สองให้เหลือ 2 column คือ key และ bbb พร้อมเปลี่ยนชื่อ column ผ่าน copy stage
จากรูปจะเห็นว่า เราไม่เอา column aaa ไปด้วย




4. เอาส่วนแรกเป็น master และส่วนที่สองเป็น update รวมข้อมูลกันผ่าน merge stage โดยใช้ column key เป็น key




 





ข้อจำกัด

ข้อมูลต้องเป็น pattern ว่า ในบรรทัดหนึ่งต้องมีค่าเพียง column เดียวเท่านั้น นอกนั้นต้องเป็น null
 
DataStage Release: 7.5.x
Job Type: Parallel
OS: Unix

14 May 2009

DataStage: Display File Name When Using File Pattern

ปัญหา
ต้องการอ่าน sequential file หลายๆ ไฟล์ภายใน job เดียว โดยให้มีชื่อ file แปะไว้เป็น column สุดท้ายของแต่ละ record

ตัวอย่างข้อมูล
$ ls –l /tmp/z*.txt
-rw-r--r--    1 etluser  dstage  12 May 23 17:15 z1.txt
-rw-r--r--    1 etluser  dstage  15 May 23 17:15 z2.txt
$ cat /tmp/z*.txt
z1
z1
z2
z2
z2
 
ตัวอย่างผลลัพธ์ที่ต้องการ
z1,/tmp/z1.txt
z1,/tmp/z1.txt
z2,/tmp/z2.txt
z2,/tmp/z2.txt
z2,/tmp/z2.txt



วิธีทำ






1. กำหนด Properties ของ Sequential File Stage / Output / Properties ดังนี้
  • Source/Read Method = File Pattern
  • Source/File Pattern = /tmp/z*.txt
  • Options/File Name Column = fileNameColumn




2. ใน Column ที่ชื่อว่า fileNameColumn จะเก็บชื่อไฟล์ไว้ เพราะฉะนั้นให้ลากมันไปออกที่ data set ใน mapping ของ Copy Stage ด้วย






3. เพิ่ม environment variable ชื่อ $APT_IMPORT_PATTERN_USES_FILESET ลงไปใน job parameter และกำหนดค่าตอน run time
  • กำหนดให้เป็น False (Default value) จะได้ค่า /tmp/z*.txt ออกมาใน output file

  • กำหนดให้เป็น True จะได้ค่า /tmp/z1.txt หรือ /tmp/z2.txt ตามที่มาของข้อมูลจริงๆ



DataStage Release: 7.5.x
Job Type: Parallel
OS: Unix

08 May 2009

10 Tips for Time Management (ตอนที่ 2)

6. เช็ค email วันละ 2 รอบ
email เป็นตัวกินเวลาชั้นเยี่ยมเลย เพราะหลังจากอ่านอีเมล์แล้วมักจะมีงานที่ต่อเนื่องตามมาอีกเป็นพรวน ต้องอดกลั้นที่จะเปิด email อ่านแค่วันละ 2 ครั้งเท่านั้น ไม่ต้องกังวลว่าจะมีงานด่วนเข้ามาหรอก เพราะถ้ามันด่วนจริงคนส่งจะโทรมาหาคุณแน่นอน
เมื่อเช็ค email แล้วก็ clear inbox ด้วย ถ้ามีงานต่อเนื่องให้รีบทำในช่วงเวลานี้เลย ยกเว้นเสียแต่ว่าเป็นงานใหญ่ที่ต้องใช้เวลานาน

7. จัดเอกสารให้เรียบร้อยทุกวัน
เคลียร์โต๊ะให้สะอาด จัดเอกสารต่างๆให้เป็นระเบียบ นอกจากจะสบายตาแล้ว ยังช่วยให้เราค้นหาเอกสารได้ง่ายขึ้นด้วย ยอมสละเวลาวันละนิดเพื่อทุ่นเวลามหาศาล

8. เริ่มต้นวันด้วยงานที่ใช้สมองมากที่สุด
ในตอนเช้าสมองเราจะสดชื่นที่สุด เพราะฉะนั้นจงใช้มันให้เต็มที่ เลือกดูว่างานใดใน To-Do List ที่ต้องใช้ความคิดมากที่สุด หยิบงานนั้นมาทำก่อน แล้วปิดท้ายแต่ละวันด้วยงานง่ายๆ ซึ่งจะทำให้คุณมีความสุขหลังเลิกงานกับครอบครัวได้ไม่ยากนัก

9. พักผ่อนเมื่อหมดแรง
ถ้ารู้สึกล้า ก็ละสายตาจากงานบ้าง พักเบรกสั้นๆ ซัก 5 นาที ลุกออกจากโต๊ะทำงาน เดินไปดื่มน้ำ เข้าห้องน้ำ คุยกับเพื่อนร่วมงาน กินผลไม้ซักชิ้น จะทำให้คุณสดชื่นขึ้นมาได้อีกครั้ง

10. อย่าหักโหม
อย่าหักโหมมากนัก ถ้ารู้สึกว่าทำงานต่อไปไม่ไหวแล้ว เริ่มรู้สึกสมองตัน อย่าฝืน!! เพราะผลงานที่ได้ออกมาคงจะได้ไม่ดีนัก กลับไปพัก พรุ่งนี้ค่อยลุยกันใหม่ ถึงแม้ว่าประสิทธิภาพในวันนี้จะดูไม่ดี แต่ระยะยาวแล้วมันช่วยไม่ให้เราหมดไฟไปเสียก่อน

ที่มา http://www.thesimpledollar.com/2009/03/26/most-time-management-is-rubbish-here-are-ten-things-that-work-for-me/

07 May 2009

10 Tips for Time Management (ตอนที่ 1)

ถอดความมาจาก http://www.thesimpledollar.com/2009/03/26/most-time-management-is-rubbish-here-are-ten-things-that-work-for-me/

เก็บเอาไว้ใช้เวลางานยุ่งๆ เวลามีหลายโปรเจคท์ประดังเข้ามา อย่างที่คนเขียนทิปนี้กล่าวไว้ว่า “ทิปเหล่านี้น่าจะมีประโยชน์กับคุณบ้างไม่มากก็น้อย อย่างน้อยที่สุดคงไม่เสียหายอะไรถ้าจะลองมันซักตั้ง”

1. หลีกเลี่ยงการทำงานแบบ Multi-tasking
การเริ่มงานในแต่ละครั้งเราต้องเสียเวลาในการตั้งสมาธิใหม่ทุกครั้ง ยิ่งเราทำงานแบบ Multi-tasking ทำให้เราเสีย overhead ตรงนี้เยอะขึ้น และผลลัพธ์ที่ได้คือ การห่วงหน้าพะวงหลัง สุดท้ายคุณภาพของงานโดยรวมก็ลดลงด้วย
ข้อแนะนำ: กำปั้นทุบดินครับ… ทำงานเพียงอย่างเดียวในเวลาหนึ่งๆ ทุ่มแรงลงไปให้สุดๆ ปล่อยวางงานที่เหลือไป ให้เวลากับมันซักหนึ่งชั่วโมง จากนั้นพักผ่อนห้านาที ดูว่ามีอะไรด่วนเข้ามามั้ย แล้วตะลุยงานต่อ ทำอย่างนี้วนไปเรื่อยๆ จนเสร็จงานนั้น ถ้าจะให้ดีควรป้องกันสิ่งที่จะมารบกวนคุณซะ เช่น ปิดมือถือ ปิด email ปิดห้อง ปิดทุกอย่าง ตั้งนาฬิกาปลุกไว้หนึ่งชั่วโมง คุณจะได้ไม่ต้องพะวงว่าคุณใช้เวลาไปเท่าไหร่แล้ว

2. พกสมุดโน้ตไว้กับตัวเสมอ
ไว้จดสิ่งต่างๆ ไม่ว่าจะเป็น idea ที่คิดขึ้นได้ สิ่งที่เราต้องทำ ความรู้ที่ต้องไปหาเพิ่มเติม สิ่งต่างๆเหล่านี้มักจะผุดขึ้นมาในหัวเสมอๆ บางครั้งเราก็ปล่อยมันไปและคิดว่าเมื่อมีเวลาว่างจะกลับมาคิดต่อ แล้วเราก็มักจะลืมทุกที หรือบางครั้งความคิดผุดขึ้นมา เราก็จะลงมือทำเลย ส่งผลให้เกิด Multi-tasking ขึ้นมาอีก
ข้อแนะนำ: จดไว้ครับ จดในสมุดโน้ตก็ได้ PDA ก็ได้ มีเวลาค่อยหยิบจับมันขึ้นมาดู

3. จัดการกับจดหมายวันละหนึ่งถึงสองครั้ง
ไล่ดูจดหมายที่ส่งมาหาคุณวันละครั้งหลังเลิกงาน จากนั้นก็แยกออกมาว่า อันไหนไม่ต้องสนใจก็ฉีกมันทิ้งไป อันไหนต้องลงปฏิทินหรือลงสมุดนัด อันไหนต้องเพิ่มลงใน to-do list ควรทำทุกวันจดหมายจะได้ไม่หมักหมม

4. จดรายชื่อโครงการที่อยากทำไว้
โครงการที่ว่านี้เป็นอะไรก็ได้ไม่จำเป็นต้องเกี่ยวกับที่ทำงาน เช่น โครงการทำความสะอาดห้องนอน โครงการซ่อมครัว โครงการล้างรถ เป็นต้น เขียนมันลงไปในสมุดโน้ตของเรา นึกอะไรออกก็เขียนลงไปตามลำดับ เมื่อมีเวลาว่างก็ให้กลับมาดูที่กระดาษแผ่นนี้ ไล่ดูว่าอยากทำโครงการไหน ไม่จำเป็นต้องทำตามลำดับ เมื่อทำโครงการไหนเสร็จสิ้นก็ขีดฆ่ามันซะ
วิธีนี้จะช่วยให้เราเห็นว่า เมื่อเวลาผ่านไปโครงการไหนที่ไม่ถูกขีดฆ่าโดยเฉพาะโครงการเก่าๆ แปลว่าเราไม่อยากทำมันจริงๆ

5. ทำ To-Do List ทุกวัน
ตื่นเช้ามาคุณควรจะใช้เวลานั่งจดสิ่งที่คุณต้องทำวันนี้ให้ลุล่วง ไม่ต้องมากนักซัก 4-5 อย่างก็พอ โดยไม่นับพวกงานรูทีนทั้งหลายนะ แล้วจงทำมันให้ลุล่วงไปให้ได้ทุกข้อ ใช้เทคนิคในข้อ 1 มาช่วยก็ได้นะ
อีก 5 ข้อมาต่อตอนหน้า

04 May 2009

Experimental Travel

เห็นพวกเราชอบเที่ยวกัน เลยเอาการท่องเที่ยวแบบทดลอง (Experimental Travel) มานำเสนอ

นาย Joel Henry ชาวฝรั่งเศส แกคงเที่ยวมาเยอะ เที่ยวแบบธรรมดาคงไม่มีอะไรตื่นเต้นแล้ว แกเลยนึกหาอะไรสนุก ออกจะเพี้ยนๆด้วย ใส่เข้าไปในทริป เช่น
  • Fly by Night คือเลือกไปถึงที่หมายในตอนหัวค่ำ แล้วตะลุยเที่ยวไม่หลับไม่นอนก่อนจะออกเดินทางจากเมืองนั้นก่อนพระอาทิตย์ขึ้น
  • Barman's Knock ทริปคนขี้เมา เริ่มด้วยไปที่ผับๆหนึ่ง สั่งเครื่องดื่ม 1 หน่วย (กั๊ก ขวด เหยือก อะไรก็ได้) แล้วถามบาร์เทนเดอร์ว่าผับไหนและเครื่องดื่มอะไรที่เขาชอบ แล้วเราก็ไปตามที่เขาบอก ทำซ้ำไปเรื่อยๆ จนไปต่อไม่ไหว
  • Monopoly Travel ทริปเกมเศรษฐี ไปถึงประเทศไหนก็ซื้อเกมเศรษฐีของประเทศนั้นมา แล้วก็ไปตามสถานที่ต่างๆ ที่ระบุในเกมเท่านั้น
  • Ero Tourism ทริปนี้หมาะสำหรับคู่รักครับ โดยให้แยกกันเดินทางกันคนละวิธี เช่น คนหนึ่งไปรถไฟ อีกคนไปเครื่องบิน เมื่อถึงเมืองที่หมายก็พยายามหากันให้เจอ
เจ๋งมั้ยครับ? แต่แบบสุดท้ายนี่ออกจะเสี่ยงไปหน่อยนะ แต่ผู้ชายบางคนอาจจะชอบก็ได้ อิอิ

ที่มา: หนังสือ"ป๋าไม่กลัวน้ำร้อน"

27 April 2009

DataStage: How to create project

การสร้าง Project บน DataStage สามารถสร้างได้ 2 วิธี คือ

1. เพิ่ม Project ใหม่ใน DataStage Administrator
2. สร้าง Project ตอนติดตั้ง DataStage Engine

25 March 2009

DataStage: Transformer, Filter และ Switch แตกต่างกันอย่างไร


Transform Stage
Filter Stage
Switch Stage
1.เวลา
ใช้เวลาน้อยที่สุด
ใช้เวลามากที่สุด
มากกว่า Transform แต่น้อยกว่า Filter
2.เวลาในการCompile
นานที่สุด
พอๆกับ Switch
พอๆกับ Filter
3.กรองค่า
ใช้กรอง Dataได้
ใช้กรอง Dataได้
ใช้กรอง Dataได้
4. Function
สามารถใส่ Functionได้
ใส่ Function ไม่ได้
ใส่ Function ไม่ได้
5. การ Filter
สามารถนำ Column ตั้งแต่ 2 Column มาใช้ในการกรองร่วมกันได้
สามารถนำ Column ตั้งแต่ 2 Column มาใช้ในการกรองร่วมกันได้
กำหนดเป็นค่า ได้ 1 ค่า
6. การใช้ Parameter
ไม่สามารถใช้ Parameter ร่วมได้ จะติดในส่วนของ Link Column
สามารถกรองโดยใช้ Parameter ร่วมได้
ไม่สามารถใช้ Parameter ร่วมได้ จะติดในส่วนของ Link Column
7. Output limit links
ไม่ได้บอกว่าจำกัดเท่าไหร่
ไม่ได้บอกว่าจำกัดเท่าไหร่
128 Output links
8. เครื่องหมายทางคณิตศาตร์
ใช้ได้ทุกเครื่องหมาย
ใช้ได้ทุกเครื่องหมาย
ใช้ได้แค่เท่ากับ (=)



แถมรูปการทดลอง Performance









DataStage: Preserve Partition

เวลารัน job EE แล้วมันชอบขึ้น Warning ว่า
Copy_20: When checking operator: Operator of tyoe "APT_CopyOperator": will partition despite the preserve-partitioning flag on the data set on input port 0.
สาเหตุคือ
Stage มันจำค่า Partition เดิมเอาไว้ ทำให้เมื่อมีการ re-partition จึงฟ้อง warning นี้ขึ้นมา

วิธีการแก้ไข
เข้าไปใน Stage ที่เราต้องทำการRe-Partition แล้ว ไปที่ Tab Stage > Advance > Preserver partitioning เลือก Clear  แล้วลอง Run ซ้ำใหม่อีกครั้ง Warning จะหายไป ตามรูป




24 March 2009

DataStage: Dataset เก็บข้อมูลไว้ที่ไหน

dataset จะมีการแยกเก็บข้อมูลเป็น 2 ส่วน คือ ส่วน header และ ส่วน data
  • header จะเก็บไฟล์ตาม path ที่ระบุไว้ใน DataStage Job โดยในไฟล์จะเก็บรายละเอียดเกี่ยวกับ configuration file ที่ใช้ในการรัน และบอกว่าไฟล์ที่เก็บ data จริงๆ ของ dataset นั้นๆ อยู่ที่ไหน
  • data จะถูกเก็บไว้ตาม path ที่ระบุไว้ที่ resource disk ใน configuration file โดยจะแยกเก็บเป็นไฟล์ๆ ขึ้นอยู่กับจำนวน node ที่ระบุใน Configuration file
กรณีที่พื้นที่ในการเก็บ dataset เต็ม สามารถตรวจสอบได้โดยดู path ทั้งหมดที่ใช้เก็บ dataset จาก Configurtion file จากนั้นทำการตรวจสอบแต่ละ path ที่ list มา โดยดูเปอร์เซ็นต์การใช้งานว่า path ไหนเต็มบ้าง (โดยใช้คำสั่ง df [-k|-h] [path]) หรือดูได้จาก Data Set Management ว่าไฟล์นี้ใช้ node ไหนบ้าง และ data จริงถูกเก็บไว้ที่ไหน ดังรูป








19 March 2009

DataStage: Configuration File

Configuration File จะถูกเก็บอยู่ที่ path [dshome]/../Configurations เป็นไฟล์นามสกุล .apt ซึ่งจะบอกว่า Job ที่เราจะรันว่าใช้กี่ node ในการรัน แต่ละ node อยู่บน server ตัวไหน กำหนดพื้นที่สำหรับเก็บข้อมูล และพื้นที่สำหรับ temporary file ไว้ที่ไหนบ้าง ดังรูป





  • fastname 
บอกชื่อ server ที่ใช้ในการรัน process
  • pool 
เป็นเหมือนชื่อเล่น หรือกรณีกำหนดเป็น reserve word ระบบจะสามารถรู้ได้เลยว่า pool นี้เอาไว้ใช้ทำงานอะไร เช่น ถ้ากำหนดเป็น sort ก็จะใช้สำหรับการ sort data เท่านั้น

ส่วน ใน Job ก็สามารถกำหนดได้ว่า Stage ไหนจะให้ใช้ pool ไหนในการทำงาน โดยกำหนดที่ properties ของ Stage นั้นๆ ตรง tab Stage>Advanced สามารถกำหนดได้ที่ Node pool and resource constraints โดยระบุค่าตรง Constraint เป็น Node pool และกำหนดชื่อ pool ที่ต้องการใช้ ดังรูป





ในกรณีที่กำหนดชื่อ pool เป็น reserve word ซึ่ง DataStage จะรู้จักอยู่แล้ว ก็ไม่ต้องกำหนดที่ Stage ใน Job ก็ได้
  • resource disk 
เป็นตัวระบุพื้นที่ที่ใช้เก็บข้อมูลพวก dataset ซึ่งในระดับนี้สามารถกำหนดชื่อ pool ได้ด้วย โดยเลือก Constraint เป็น Resources และกำหนดชื่อ pool ที่ต้องการใช้ ดังรูปข้างบน

การกำหนด node pool จะช่วยในการจัดการเรื่อง CPU และ Memory

การกำหนด disk pool จะช่วยในเรื่องการจัดการ disk เพราะใน 1 node มีการกำหนด resource disk ได้หลายค่า ทำให้สามารถเลือกได้ว่า จะเก็บข้อมูลไหนใน disk ไหน
  • resource scratchdisk 
เป็นตัวระบุพื้นที่ที่ใช้เก็บ temporary file ที่เกิดขึ้นระหว่างการทำงาน เมื่อการทำงานนั้นๆ เสร็จสิ้นลง temporary file ที่ถูกสร้างขึ้นมาจะโดนลบทิ้งไป ซึ่งใน 1 node สามารถกำหนด resource scratchdisk ได้หลายค่า

ในกรณีที่ resource scratchdisk ที่กำหนดไว้ ถูกใช้จนเต็ม จะไปใช้พื้นที่ของ Temp ที่กำหนดไว้ใน DataStage และ /tmp ของระบบ ตามลำดับ

Temp ของ DataStage สามารถดูได้ที่ uvconfig ใน DataStage Home Directory ที่ parameter UVTEMP

เพราะฉะนั้น หากต้องการกำหนดให้บาง server เท่านั้น ที่ทำการ sort data สามารถกำหนดได้โดย กำหนดที่ pool ระดับ fastname ว่าให้ใช้ในการ sort หรือสามารถกำหนดได้ที่ properties ของ Sort Stage ว่าจะใช้ node ไหนในการทำงาน
*** Home Directory ของ DataStage สามารถดูได้โดยใช้คำสั่ง cat /.dshome

Reserve word ที่ใช้ในการกำหนดชื่อ node pool มีดังนี้
1. DB2
2. INFORMIX
3. ORACLE
4. sas
5. sort
6. syncsort

Reserve word ในการกำหนดชื่อ disk pool มีดังนี้
1. buffer
2. export
3. lookup
4. sasdataset
5. sort
6. syncsort

09 February 2009

DataStage: Oracle Date

กรณีดึงข้อมูลจาก column ที่มี data type เป็น date หากกำหนด data type ใน datastage เป็น date ตาม table จะมี error เกิดขึ้น

Error Message:
Oracle_Enterprise_0: Error when checking operator: When binding output interface field "HOMELOANDATE" to field "HOMELOANDATE": No default type conversion from type "timestamp" to type "date".

วิธีแก้ไข
1. กำหนด data type ใน oracle stage เป็น timestamp จากนั้นทำการแปลง data type จาก timestamp เป็น date โดยใช้ function TimestampToDate() ดังตัวอย่าง
TimestampToDate(lnk_alscom_application.PERSONALLOANDATE)

หรือ

2. ตอน select ข้อมูลจาก Table ให้ทำการแปลง data โดยใช้ function TO_CHAR เพื่อเปลี่ยนข้อมูลเป็น character โดยใน datastage ให้กำหนด data type เป็น Varchar
TO_CHAR(HOMELOANDATE,'DD/MM/YYYY') as HOMELOANDATE
จากนั้นค่อยแปลงข้อมูลกลับเป็น date อีกที โดยใช้ function StingToDate() ดังนี้
StringToDate(lnk_alscom_application.HOMELOANDATE,"%dd/%mm/%yyyy")
โดยที %dd/%mm/%yyyy เป็น format ของ string
ทั้ง 2 วิธีจะได้ output ออกมาเป็น format YYYY-MM-DD เหมือนกัน

06 February 2009

DataStage: Find TOPn by Head Stage

นอกจากนี้การหา ค่าสูงสุด 20 อันดับแรกโดยใช้ Range Partition สามารถใช้อีกวิธีคือ การประยุกต์ใช้ Head Stage ดังนี้



รูป 1

จากรูป 1 เป็น Job ที่ใช้หาค่าสูงสุด 20 อันดับแรก หลังจากใช้ Sort Stage ที่ชื่อ srt_Data_In_Partition ในการเรยงลำดับข้อมูล CRN_BAL ในแต่ละ Partition จาก มากไปหาน้อยเรียบร้อยแล้ว จึงใช้ Head Stage ที่ชื่อ hd_Top_100 เลือกข้อมูล 100 อันดับแรก จากแต่ละ Partition โดย กำหนดค่า Property ใน Head Stage รูป 2) ดังนี้
- Rows
- Number of Rows (Per Partition) กำหนดเป็น 100 เพื่อเลือกข้อมูล 100 รายการแรก ของ ทุก Partition

- Partitions
- All Partitions กำหนดเป็น True เพื่อเลือกข้อมูล ทุก Partition




รูป 2

เมื่อผ่าน Head Stage ที่กล่าวมาจะทำให้ได้ ข้อมูลออกมา 400 รายการ แล้วจึง ใช้ Head Stage ชื่อ hd_Top_20_on_Partition_0 เพื่อเลือกข้อมูล เฉพาะ 20 รายการแรก โดยกำหนด ให้ Execution Mode เป็น Sequential เพื่อรวมข้อมูลที่ถูกแบ่งออกเป็น Partition เป็น File เดียว โดย กำหนดที่ Stage tab และ ไปที่ Advance Tab เลือกกำหนดค่า Execution Mode เป็น Sequential ที่ List Box ที่ชื่อ Execution Mode (รูป 3) จากนั้นจึง กำหนดค่า Number of Row (Per Partition) เป็น 20 และ All Partition เป็น True เพื่อเลือก 20 รายการแรก (รูป 4)



รูป 3



รูป 4

05 February 2009

DataStage: Range Partition

Range Partition เป็นการแบ่งข้อมูล ในแต่ละ Partition แบบเท่าๆ กัน ซึ่งในแต่ละ Partition จะเก็บข้อมูล โดยแบ่งตาม Range ของข้อมูล ตาม Column ที่สนใจ 1 Column หรือ มากกว่า ขึ้นไป เพื่อใช้ประโยชน์สำหรับเก็บข้อมูลที่สัมพันธ์กันไว้ใน Partition เดียวกัน นอกจากนั้น ในแต่ละโหนด อาจมี Range ที่มีขอบเขตมากน้อยไม่เท่ากัน เพื่อเก็บข้อมูลในแต่ละโหนดให้มีจำนวนเท่าๆ กัน โดยส่วนใหญ่ Range Partition มักจะใช้ก่อนหน้าที่จะ ทำการเรียงข้อมูล

ในการใช้งาน Range Partition จำเป็นต้องมีการสร้าง Range Map ซึ้งทำได้โดย ใช้ Stage ชื่อ Write Range Map ซึ่งจะแสดงรายละเอียดในหัวข้อถัดไป



รูป 1

จากรูป 1 เป็นกราฟ แบบแท่ง แสดงแบ่ง Partition ตามข้อมูลอายุ โดยกราฟแต่ละแท่งคือจำนวน Partition และ  Range ของแต่ละ Partition คือ ตัวเลขที่ปรากฎบนแท่งกราฟ ความสูลของกราฟ คือ จำนวนรายการข้อมูลที่บรรจุในแต่ละ Partition สังเกตุว่า Data Stage จะแบ่งข้อมูลให้เก็บในแต่ละ Partition ให้เท่าๆ กัน โดยมีขอบเขตของ Range ของข้อมูล ในแต่ละ Partition อาจไม่เท่ากัน โดยการคำนวณจะใช้ Range Map ในการคำนวณ


การใช้งาน Range Partition




รูป 2

จากรูปเป็นการรวม Sequential File 3 File เพื่อหาข้อมูลที่เก็บใน Column ชื่อ CRN_BAL สูงสุด 20 อันดับแรก ซึ่งก่อนหน้าจำทำการเรียงลำดับข้อมูล CRN_BAL โดย Sort Stage ที่ชื่อ srt_Data_In_Partition แล้วใช้ Head Stage ที่ชื่อ hd_Top_20_on_Partition_0 เพื่อเก็บเฉพาะข้อมูล 20 รายการแรก จะต้องทำการเปลี่ยนแปลง Partition ให้เป็นแบบ Range Partition โดยกำหนดที่ Transformer Stage  ที่ชื่อ xfrm_Set_Range_Partition

จากที่กล่าวมา ในเมื่อมีการใช้ Partition แบบ Range Partition จะต้องมีการสร้าง Range Map ก่อน แล้วจึงนำ Range Map ที่ได้ ไปใช้เมื่อต้องการใช้ Partition แบบ Range Partition ดังนั้นก่อนหน้าที่จะสร้าง Job ดังรูป 1 ต้องสร้าง Job เพื่อสร้าง Range Map ดังต่อไปนี้




รูป 3

จากรูป 3 เป็น Job สำหรับสร้าง Range Map โดยนำ Sequential File ทั้ง 3 มารวมกัน และ เรียงลำดับข้อมูลใน CRN_BAL ด้วย Sort Stage ชื่อ srt_By_CRN_BAL เพื่อจำเรียงข้อมูลก่อน จะสร้าง Range Map ด้วย Write Range Map Stage ชื่อ Write_Range_Map

เนื่องจาก การสร้าง Range Map นั้น Data Stage จะอ่านข้อมูล CRN_BAL ทั้งหมดเพื่อการคำนวน Range ของข้อมูล ให้สัมพันธ์กับ จำนวน Partition ที่กำหนด ดังนั้นการเรียงลำดับจะช่วยให้ การสร้าง Range Map ทำได้เร็วขึ้น จึงควรมีการใช้ Sort Stage ก่อน Write Range Map Stage



รูป 4



รูป 5

จากรูป 4 เป็นการกำหนดค่าสำหรับ Write Range Map Stage ที่ Input Tab ไปที่ Property Tab กำหนด  Option ต่างๆ ดังนี้

- File Update Mode กำหนดเป็น Overwrite เพื่ออนุญาติให้สามารถสร้าง Range Map ทับ File เดิมได้
- Key กำหนดเป็น CRN_BAL ซึ่งก็คือ Key Column ที่ต้องการสร้าง Range Map โดย กำหนด Option ย่อย ชื่อ Sort Order เป็น Descending เพื่อให้เรียงข้อมูลแบบมากไปหาน้อย
- Range Map File กำหนด Path และ ชื่อ File ที่ใช้เก็บ Range Map (รูป 5) โดยจะนำไปใช้เมื่อต้องการแบ่ง Partition แบบ Range Partition

การประยุกต์ใช้ Range Partition เพื่อหา Top20
เมื่อ Run Job ที่ใช้สร้าง Range Map เรียบร้อย จึงนำ Range Map (File และ Path ที่กำหนดเมื่อสร้าง Range Map ดังที่กล่าวมา) ดังต่อไปนี้



รูป 6

กำหนด รูป แบบ Partition ที่ Transformer Stage ที่ชื่อ xfrm_Set_Range_Partition ของ Job ในรูป 2 ที่ Inputs Tab และ ไปที่ Partitioning Tab กำหนด Property ต่างๆ ดังนี้

- Partition Type กำหนดเป็น Range เพื่อเลือก การแบ่ง Partition แบบ Range Partition
- Available กำหนดเป็น CRN_BAL (เมื่อ Click แล้ว จะไปปรากฏที่ Column ชื่อ Key ของตาราง Selected) เป็นการกำหนด Key Column โดย กำหนด Option ที่ตาราง Select  เป็น Descending

หมายเหตุ : ในการเลือก Key Column และ Option จะต้องเลือกให้เหมือนกับ Range Map ที่ได้สร้างไว้

- File Name และ Part ของ Range Map โดย Click ที่ปุ่ม   ที่ปรากฏด้านหลังของ List Box ที่ชื่อ Partition Type โดยเมื่อ Click แล้ว ช่องให้ระบุ Name และ Part ของ Range Map

หลังจากที่กำหนด Property ที่ Write Range Map Stage แล้วจึงทำการเรียงลำดับข้อมูลโดยใช้ Sort Stage ที่ชื่อ srt_Data_In_Partition โดยกำหนดให้ เรียงลำดับตาม ข้อมูลใน Column ที่ชื่อ CRN_BAL และ เรียงลำดับแบบ Descending แต่ต้องมีการกำหนด Partition Type ของ Sort Stage แบบ Same เมื่อให้ใช้ การแบ่ง Partition แบบเดียวกันกับ Transformer Stage ที่ส่งข้อมูลเข้ามา จะทำให้ข้อมูล CRN_BAL ที่มากที่สุดถูกเก็บไว้ที่ Partition ที่ 1



รูป 7

เมื่อได้ข้อมูลที่ถูกเรียงลำดับ CRN_BAL จากมากไปหาน้อย และ ข้อมูลดังกล่าว ถูกเก็บไว้ที่ Partition ที่ 1 ขั้นต่อไปเป้นการเลือกข้อมูล เฉพาะ 20 อันดับแรก จากรูป 7 เลือกใช้ Head Stage โดยกำหนด Property ตามขั้นตอนต่อไปนี้

เลือก Stage Tab และ ไปที่ Property Tab กำหนด Property ดังนี้
- Rows
- Number of Rows (Per Partition) กำหนดเป็น 20 เพื่อเลือกข้อมูล 20 รายการแรก ของ ทุก Partition

- Partitions
- All Partitions กำหนดเป็น False เพื่อเลือกข้อมูล เฉพาะ Partition ที่สนใจเท่านั้น
- Partition Number กำหนดเป็น 0 เพื่อเลือกข้อมูลจาก Partition ที่ 1  (เลขที่ ที่ใช้กำหนด Partition ที่สนใจ จะเริ่มจาก 0 คือ Partition ที่ 1 และ 1 คือ Partition ที่ 2 ต่อเนื่องกันไปตามจำนวน Partition)

ดังนั้นจากตัวอย่าง Range Partition สามารถใช้หาข้อมูล สูงสุด 20 อันดับ โดย ให้ Range Partition ช่วยในการรวบรวมข้อมูล สูงสุด ไปหา ต่ำสุด เก็บไว้ที่ Partition ที่ 1, 2, 3 … ไปจนถึง Partition สุดท้าย จากนั้นจึงใช้ Sort Stage ช่วยในการเรียงลำดับข้อมูลในแต่ละ Partition จากมากไปหาน้อย แล้วจึง ใช้ Head Stage เลือกข้อมูล 20 อันดับแรกจาก Partition ที่ 1 จึงทำให้ได้ข้อมูล 20 อันดับแรก ที่ถูกต้อง

03 February 2009

IBM Technical Library View

เอกสารเกี่ยวกับ Informix Dynamic Server (IDS) และ DataStage เต็มเลย เอาตัวอย่างไปดูก่อน

Informix
DataStage
ทั้งหมดมาจาก Technical library view ของ IBM DeveloperWorks
ว่างๆ ก็เข้าไปอ่านได้

30 January 2009

Oracle: How to import data by Toad (2)

วิธี Import File บน Toad Oracle มี 2 วิธี
1. Import Table Data เป็นการ Import Text File
2. Import Utility Wizard เป็นการ Import Dump File สามารถเลือก Import แบบ Partial Table ได้ และ ตั้ง Schedule การ Import ได้

วิธีที่ 2 Import Utility Wizard เป็นการ Import Dump File สามารถเลือก Import แบบ Partial Table ได้ และ ตั้ง Schedule การ Import ได้

ขั้นตอน
2.1 Import Utility Wizard  เข้า database > Import > Import Utility Wizard



2.2 เลือก Import tables แล้ว กด Next



2.3 ในช่อง From User ให้พิมพ์ชื่อ Schema table ที่มาจาก Source dump File เราจะทราบได้จาก File log ที่มาพร้อม กับ dump  file ในที่นี้ dump file มาจาก  OFSADBA ต่อจากนั้นให้กำหนด Schema ปลายทาง ในช่อง To User ต่อจากนั้นกด Next





2.4 ไม่ต้องเปลี่ยนแปลง Default กด Next



2.5 กำหนด Path ที่ dump file อยู่ โปรแกรมจะ auto generate log file และ parameter file ให้เอง ต่อจากนั้นกด Next



2.6 หาก ต้องการ Import เลยให้กด เลือก Import now แล้วกด Finish โปรแกรมจะทำการ Import dump file ให้  ในกรณีที่ต้องการ ตั้ง Schedule ให้เลือก Schedule to run later แล้วกด Next



2.8 ถ้าเลือก Schedule โปรแกรม จะ Pop up task name ขึ้นมาเพื่อให้ตั้งชื่อ schedule ในการ run สามารถสั่ง Run แบ ทุกวัน ,ทุกสัปดาห์ , ทุกเดือน หรือ Run ครั้งเดียวก็ได้



กำหนด เวลา และ วันที่ที่ต้องการ Run



กำหนด User name และ Password



กด Finish เพื่อเริ่มการ ตั้ง Schedule



ปัญหาที่พบในการ Import 
1. กำหนดค่า From user ในข้อ 2.3 ผิด
2. ไม่มี Tablespace สำหรับ Table ที่ต้องการ dump ลงไป

Oracle: How to import data by Toad (1)

วิธี Import File บน Toad Oracle มี 2 วิธี
1. Import Table Data เป็นการ Import Text File
2. Import Utility Wizard เป็นการ Import Dump File สามารถเลือก Import แบบ Partial Table ได้ และ ตั้ง Schedule การ Import ได้


1. Import Table Data เป็นการ Import Text File ที่มี Format เข้า Table

ขั้นตอน
1.1  เข้า menu database > Import > Import Table Data




1.2 เลือก ปลายทาง Schema ,Object Type และ Object Name ที่ต้องการจะ Import Data เข้า หลังจากนั้นกด Show data และ กด Next



1.3 โปรแกรมสามารถ เลือก Import จาก Text File หรือ Excel File ในที่นี้เราต้องการ Import File จาก Text เข้า Table ดังนั้นจึงต้องเลือก  Import From Text File และเลือก Path ที่ File นั้นอยู่ ต่อจากนั้นกด Next



1.4 ระบุ Delimiter ที่คั่นระหว่างข้อมูล และกด Next
*** ข้อควรระวัง หากข้อมูลมี Format เป็น Unix ต้องทำการเปลี่ยน Record Separate เป็น LF ***



1.5 สามารถกำหนด จำนวน row ที่จะนำเข้าได้ ให้กำหนด First Rows เป็น 1 และ Last Rows:ไม่ต้องกำหนด ต่อจากนั้นกด Next
*** ข้อควรระวัง ในกรณี ที่ Column มี Column ที่เป็น Date ให้ตรวจสอบ Format และเลือก Format ให้ตรง
ใน Date Order ว่าเป็น YMD,DMY,MDY หากกำหนด Format Date ผิด ข้อมูลอาจผิดเพี้ยนได้



1.6 โปรแกรม จะ Preview Data เมื่อตรวจสอบแล้ว หากไม่พบปัญหา ให้กด Next



1.7 สามารถ กำหนด Primary Key ได้ หากไม่ต้องการกำหนดให้กด Next



1.8 โปรแกรม จะ แสดง Preview Results ให้ดู กด Next



1.9 กำหนด Commit Mode ให้เป็น Commit after each record แล้วกด execute



1.10 โปรแกรมจะแสดงผล การ Import กด OK เพื่ออกจาก การ Import data