powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с чисткой таблицы
8 сообщений из 8, страница 1 из 1
Проблема с чисткой таблицы
    #37190348
segoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица DOC в ней примерно 3 миллиона записей. Периодически запускается чистка данной таблицы, удаляются данные старше определенной даты например delete * from DOC where DATPROF < '2010-07-26'. Удаляется несколько тысяч записей. Если возможность изменить SQl, что бы удаление происходило допустим по 500 записей, а потом выполнялся COMMIT?
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37190537
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
segoff,

Update большого числа записей
Код: plaintext
call huge_change('select 1 from DOC where DATPROF < ''2010-07-26'' for update', 'delete from DOC',  500 , ?)
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37190787
segoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, то что нужно.
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37190887
A.Panskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для DELETE могу предложить вот такой вариант

CREATE PROCEDURE "NULLID"."DELETE_WITH_COMMIT"
(IN "TABNAME" VARCHAR(128),
IN "PREDICATE" VARCHAR(1000),
IN "COMMITCOUNT" INTEGER,
IN "LOCKTABLE" INTEGER
)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE SQLCODE INTEGER;
DECLARE txt VARCHAR(10000) ;
DECLARE stmt,stmt_lock STATEMENT;

if locktable = 1 then
SET txt = 'lock table ' || tabname || ' in exclusive mode';
PREPARE stmt_lock FROM txt;
EXECUTE stmt_lock;
end if;

SET txt = 'DELETE FROM (SELECT 1 FROM ' || tabname;

if predicate is not null and rtrim(predicate) <> '' then
set txt = txt || ' WHERE ' || predicate;
end if;

set txt = txt || ' 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;
if locktable = 1 then
EXECUTE stmt_lock;
end if;
END LOOP;
COMMIT;
END;


Использовать

простой предикат
call NULLID.DELETE_WITH_COMMIT('SCH.TABLE','DT < ''2011-01-01'' ', 5000,0);

более сложный предикат

call NULLID.DELETE_WITH_COMMIT(
'SCH.ACTIVITY t ',
'exists (select 1 from loading.ACTIVITY l where t.op_id=l.op_id)',
1000,
0)
;
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37190911
segoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A.PanskikhДля DELETE могу предложить вот такой вариант

CREATE PROCEDURE "NULLID"."DELETE_WITH_COMMIT"
(IN "TABNAME" VARCHAR(128),
IN "PREDICATE" VARCHAR(1000),
IN "COMMITCOUNT" INTEGER,
IN "LOCKTABLE" INTEGER
)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE SQLCODE INTEGER;
DECLARE txt VARCHAR(10000) ;
DECLARE stmt,stmt_lock STATEMENT;

if locktable = 1 then
SET txt = 'lock table ' || tabname || ' in exclusive mode';
PREPARE stmt_lock FROM txt;
EXECUTE stmt_lock;
end if;

SET txt = 'DELETE FROM (SELECT 1 FROM ' || tabname;

if predicate is not null and rtrim(predicate) <> '' then
set txt = txt || ' WHERE ' || predicate;
end if;

set txt = txt || ' 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;
if locktable = 1 then
EXECUTE stmt_lock;
end if;
END LOOP;
COMMIT;
END;


Использовать

простой предикат
call NULLID.DELETE_WITH_COMMIT('SCH.TABLE','DT < ''2011-01-01'' ', 5000,0);

более сложный предикат

call NULLID.DELETE_WITH_COMMIT(
'SCH.ACTIVITY t ',
'exists (select 1 from loading.ACTIVITY l where t.op_id=l.op_id)',
1000,
0)
;

Спасибо
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37193686
segoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinsteinsegoff,

Update большого числа записей
Код: plaintext
call huge_change('select 1 from DOC where DATPROF < ''2010-07-26'' for update', 'delete from DOC',  500 , ?)


Марк под Windows всё работает отлично, под db2 v9 for z/OS выполняется только один шаг удаления и выдает ошибку
SQL0518N The statement named in the EXECUTE statement is not in a prepared state or is a SELECT or VALUES statement. SQLSTATE=07003

код процедуры
CREATE PROCEDURE ROGOV.HUGE_CHANGE
(IN PSTMT_SEL VARCHAR( 4000) FOR SBCS DATA CCSID EBCDIC,
IN PSTMT_CHG VARCHAR( 4000) FOR SBCS DATA CCSID EBCDIC,
IN PCOMMITCOUNT INTEGER,
OUT PROWSAFFECTED INTEGER)
VERSION V1
LANGUAGE SQL
DYNAMIC RESULT SETS 0
NOT DETERMINISTIC
CALLED ON NULL INPUT
MODIFIES SQL DATA
WLM ENVIRONMENT FOR DEBUG MODE IASCCA
ASUTIME NO LIMIT
INHERIT SPECIAL REGISTERS
COMMIT ON RETURN NO
DISALLOW DEBUG MODE
QUALIFIER ROGOV
PACKAGE OWNER ROGOV
NODEFER PREPARE
CURRENT DATA NO
DEGREE 1
DYNAMICRULES RUN
WITHOUT EXPLAIN
WITHOUT IMMEDIATE WRITE
ISOLATION LEVEL CS
WITHOUT KEEP DYNAMIC
OPTHINT ''
SQL PATH DEFAULT
RELEASE AT COMMIT
REOPT NONE
VALIDATE RUN
ROUNDING DEC_ROUND_HALF_EVEN
DECIMAL(31)
BEGIN
DECLARE SQLCODE INT ;
DECLARE CNT INT DEFAULT 0 ;
DECLARE DUMMY_INT INT ;
DECLARE LUPD_STR VARCHAR( 1000) ;
DECLARE C1 CURSOR WITH HOLD FOR S1 ;
SET PSTMT_CHG = PSTMT_CHG || ' WHERE CURRENT OF C1' ;
PREPARE S1 FROM PSTMT_SEL ;
PREPARE S2 FROM PSTMT_CHG ;
SET PROWSAFFECTED = 0 ;
OPEN C1 ;
FETCH C1 INTO DUMMY_INT ;
WHILE(SQLCODE != 100)
DO
SET CNT = CNT + 1 ;
SET PROWSAFFECTED = PROWSAFFECTED + 1 ;
EXECUTE S2 ;
IF(CNT = PCOMMITCOUNT) THEN
COMMIT ;
SET CNT = 0 ;
END IF ;
FETCH C1 INTO DUMMY_INT ;
END WHILE ;
COMMIT ;
CLOSE C1 ;
END ?
#SET TERMINATOR ;
COMMIT;
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37193839
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
segoff,

попробуйте вставить
Код: plaintext
PREPARE S2 FROM PSTMT_CHG ; 
после
Код: plaintext
COMMIT;
или
Код: plaintext
1.
2.
DECLARE attrstring VARCHAR( 10 ) DEFAULT 'WITH HOLD';
...
PREPARE S2 ATTRIBUTES attrstring FROM PSTMT_CHG;
...
Рейтинг: 0 / 0
Проблема с чисткой таблицы
    #37193937
segoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinsteinsegoff,

попробуйте вставить
Код: plaintext
PREPARE S2 FROM PSTMT_CHG ; 
после
Код: plaintext
COMMIT;



Спасибо, заработало.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с чисткой таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]