หลักการเพิ่มข้อมูลในตารางใหม่ให้เร็ว

คนที่ทำงานด้านฐานข้อมูลบางครั้ง คงจะคุ้นเคยเรื่องคำสั่ง insert เป็นอย่างดี คำสั่งนี้มีทั้งการ insert เพียง 1 row จะมี syntax ว่า insert into <<table_name>> values (‘’,’’,’’);  ซึ่งการใช้คำสั่ง insert แบบนี้ จะเพิ่มข้อมูลเข้าสู่ตารางได้เพียงแค่ 1 เรคอร์ดเท่านั้น 

หรือหากต้องการ insert ทุกแถวจากตารางเก่าไปสู่ตารางใหม่ จะมี syntax ดังนี้คือ  insert into <<new_table_name>> select * from <<old_table_name>>; นี้เป็นคำสั่งที่เพิ่มข้อมูลของตารางหนึ่งเข้าสู่อีกตารางหนึ่ง ก่อนที่จะ insert data เราต้องมีการ create table ก่อน 

ซึ่งการ create เราก็มีการคิดแบบพลิกแพลงได้ คือ create table โดยระบุ type, column_name ไปตรงๆ เช่น create table a (col_1 varchar2(50),col_2 number); เป็นต้น หรือวิธีที่สองในการ create table โดยอ้างอิงกับ table เก่า คือ ใช้คำสั่งว่า create table <<new_table>> as select * from <<old_table>>

เรื่องการ create table พยายามระบุ tablescpace เพราะหากไม่กำหนด default tablespace มันอาจจะเข้าไปสร้าง tablespace ชื่อ users ได้ (tablespace users นี้ระบบฐานข้อมูล oracle จะสร้างให้เองโดยอัตโนมัติติดตั้งระบบฐานข้อมูลใหม่)

การ insert data หากว่าต้องการให้มันเร็วขึ้น และมีโครงสร้างเหมือนกับต้นทาง ให้เราใช้คำสั่ง create table <<new_table>> as select * from <<old_table>>; จะเร็วและให้ประสิทธิภาพได้ดีกว่า การ create table แล้วใช้วิธี insert เข้าไป  พยายามใช้ statement ที่ไม่เป็นการวนลูปเพราะว่าการวนลูปมันช้าและจะกินเวลานาน 

การจูนนิ่งเรื่องการ insert ที่เหมาะสมจะทำให้ data เข้าสู่ table ที่เราต้องการได้เร็วขึ้น ไม่ว่า data ที่นำเข้าจะมีกี่ล้านเรคคอร์ดก็ตาม และเมื่อสร้าง table แล้วพยายามหา constraint ต่างๆ เช่น unique constraint ก็ได้, foreign constaint 

และเรื่องการจัด index ให้ table ก็สำคัญมาก โดย index ที่ไม่ใช่ primary key เราเรียกว่า non-unique index หมายความว่าค่าในฟิลด์จะเหมือนกันระหว่างสอง table ได้ 

การเขียนโปรแกรม sql อาจไม่ใช่เรื่องยากในความคิดของใครหลายคน

แต่การเขียนโปรแกรมแล้วเพิ่มความเร็วของการรัน data เป็นสิ่งที่ทำให้โปรแกรมเมอร์มีสกิลการทำงานที่เพิ่มมากขึ้น 

อนึ่งคำสั่ง create table เป็นคำสั่งประเภทที่เรียกว่า data definition language เป็นภาษาที่นิยามเรื่อง table ใน database เวลาเขียนใน block begin end; จำเป็นต้องเขียนคำว่า execute immediate ก่อนหน้านั้นด้วย เช่น 

Execute immediate ‘create table a ()’ แต่หากว่าเป็นคำสั่ง insert, update,delete เราไม่จำเป็นต้องใช้ execute immediate นี่เป็นข้อแตกต่างระหว่าง data definition language, data manipulation language (insert, update,delete)

และในคำสั่งลบข้อมูลทิ้งทั้ง data  หากว่าต้องการลบโดยไม่ต้องใช้คำสั่ง commit อีกครั้งหนึ่งก็ให้พิมพ์ว่า truncate table จะเหมาะสมมากกว่า แต่หากใช้เพียง delete ต้องพิมพ์คำสั่ง delete ด้วยข้อมูลจึงจะหายออกไปจาก database อนึ่งโปรแกรมด้านการสอบถามข้อมูล (query data) สามารถเขียนรันที่หน้าจอ shell (หน้าจอสีดำๆ ได้เช่นกัน)

 

ขอบคุณเรื่องราวจาก  Gclub ฝากขั้นต่ำ50