× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



-- category: SPL
-- description: Submit jobs to purge deleted rows
-- Cycle through a list of partitions (members) in a table with numerous deleted rows and submit
-- a job to RGZPFM those deleted rows out, if there are no locks on that member.
-- Cautions:
-- One: If you rely upon relative record number (RRN) then you should not use RGZPFM on that table.
-- Not normally a technique often used anymore.
-- Two: If someone tries to access the file while it is being reorganized it will be locked.
-- Three: There are ways to "reorg while active" but it has side effects you need to understand.
-- I did not try reorg while active for this procedure.

-- Getting the list of members from syspartitionstat is pretty efficient.
-- Adding the process to count locks on that member does add some run time
-- The following got done submitting the jobs to the job queue in 10.62 minutes on my system
-- Power 9 9009-42A lpar running IBM i 7.4 using SSD's hosted by another lpar of IBM i.
-- Development only lpar with few users on it.

CREATE PROCEDURE REMOVE_DELETED_ROWS
LANGUAGE SQL
MODIFIES SQL DATA
SET OPTION DATFMT = *ISO
P1: BEGIN
DECLARE WORK_SCHEMA_NAME CHAR(10);
DECLARE WORK_TABLE_NAME CHAR(10);
DECLARE WORK_MEMBER_NAME CHAR(10);
DECLARE COMMAND CHAR(200); -- Ensure this is large enough.
DECLARE END_TABLE INT DEFAULT 0;
DECLARE C1 CURSOR FOR WITH T1 AS (
SELECT system_table_schema,
system_table_name,
system_table_member,
number_deleted_rows,
number_deleted_rows * avgrowsize AS deleted_space,
avgrowsize
FROM qsys2.syspartitionstat
WHERE number_deleted_rows > 0
),
t2 AS (
SELECT t1.*,
number_of_locks
FROM T1,
LATERAL (
SELECT COUNT(*)
FROM qsys2.object_lock_info l
WHERE t1.system_table_schema = l.system_object_schema
AND t1.system_table_name = l.system_object_name
AND t1.system_table_member = l.system_table_member
AND l.object_type = '*FILE'
) L1 (number_of_locks)
)
SELECT t2.system_table_schema,
t2.system_table_name,
t2.system_table_member
FROM t2
WHERE t2.number_of_locks = 0
ORDER BY t2.deleted_space DESC
FETCH first 100 ROWS ONLY -- Change for your situation
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET END_TABLE = 1;
-- DECLARE EXIT HANDLER FOR SQLEXCEPTION
-- SET <insert column here> = NULL;
OPEN C1;
FETCH C1 INTO work_schema_name,
work_table_name,
work_member_name;
WHILE END_TABLE = 0 DO
SET COMMAND = 'SBMJOB CMD(RGZPFM FILE(' CONCAT TRIM(work_schema_name) CONCAT '/' CONCAT TRIM(work_table_name) CONCAT
') MBR(' CONCAT TRIM(work_member_name) CONCAT ')) JOB(' CONCAT TRIM(work_member_name) CONCAT
') JOBQ(ROB/RGZPFM)'; -- Adjust Job queue accordingly
CALL QSYS2.QCMDEXC(COMMAND);
FETCH C1 INTO work_schema_name,
work_table_name,
work_member_name;
END WHILE;
CLOSE C1;
END P1
;
-- Test
CALL ROB.REMOVE_DELETED_ROWS;

Rob Berendt

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.