ในงานของเรา อาจจะมีการลบข้อมูลเยอะๆ ไม่ว่าใน DBMS ตัวไหนก็ตามครับ ถ้าเป็น DB2 ถ้าเราลบข้อมูลเยอะๆ อาจจะเจอปัญหา Transaction Log Full ได้ครับ ครั้นจะปิด Log แล้วลบทิ้ง ก็อาจจะมีปัญหาครับ เช่น ตัว HADR ถ้าปิด Log นี้ ไม่ Sync กันนะครับ ผมเลยมี Stored Procedure ที่ช่วยในการลบข้อมูล ดังนี้ครับ
SET CURRENT SCHEMA = INVEST; SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,SYSIBMADM,INVEST; CREATE OR REPLACE PROCEDURE INVEST.DELETE_MANY_ROWS ( IN TABSCHEMA VARCHAR(128), IN TABNAME VARCHAR(128), IN PREDICATE VARCHAR(1000), IN COMMITCOUNT INTEGER ) SPECIFIC SQL160427171738433 LANGUAGE SQL NOT DETERMINISTIC EXTERNAL ACTION MODIFIES SQL DATA CALLED ON NULL INPUT INHERIT SPECIAL REGISTERS OLD SAVEPOINT LEVEL P1: BEGIN DECLARE SQLCODE INTEGER; DECLARE txt VARCHAR(10000); DECLARE stmt STATEMENT; SET txt = 'DELETE FROM (SELECT 1 FROM "' || tabschema || '"."' || tabname || '" WHERE ' || predicate || ' FETCH FIRST ' || RTRIM(CHAR(commitcount)) || ' ROWS ONLY) AS D'; PREPARE stmt FROM txt; l: LOOP EXECUTE stmt; IF SQLCODE = 100 THEN LEAVE l; END IF; COMMIT; END LOOP; END P1;
เห็น Code และมาดูก่อนว่า มันต้องใส่ Parameter อะไรบ้าง
- TABSCHEMA : ระบุชื่อ Schema ของ Table ที่ต้องการจะลบข้อมูล
- TABNAME : ระบุชื่อ Table ที่ต้องการจะลบข้อมูล
- PREDICATE : SQL เงื่อนไจในการลบข้อมูล
- COMMITCOUNT : บอกให้ Stored Procedure รู้ว่าลบไปกี่ Row แล้วถึงจะ Commit ได้ครับ อันนี้ต้องจูนให้เหมาะสมกับ ขนาดของ Transaction Log ครับ
การทำงาน วน Loop DELETE ข้อมูลจนกว่า Query จะมี SQLCODE = 100 (No Data) ซึ่งหมายถึง ลบจนกว่าคำสั่ง DELETE จะไม่มีข้อมูลให้ลบครับผม
2019 Update: เพิ่มตัวอย่างการเรียกใช้งาน [DB2] ตัวอย่างการใช้งาน Stored Procedure DELETE_MANY_ROWS
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.