Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с чисткой таблицы / 8 сообщений из 8, страница 1 из 1
30.03.2011, 15:00
    #37190348
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с чисткой таблицы
Есть таблица DOC в ней примерно 3 миллиона записей. Периодически запускается чистка данной таблицы, удаляются данные старше определенной даты например delete * from DOC where DATPROF < '2010-07-26'. Удаляется несколько тысяч записей. Если возможность изменить SQl, что бы удаление происходило допустим по 500 записей, а потом выполнялся COMMIT?
...
Рейтинг: 0 / 0
30.03.2011, 16:03
    #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
30.03.2011, 17:25
    #37190787
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с чисткой таблицы
Спасибо, то что нужно.
...
Рейтинг: 0 / 0
30.03.2011, 17:57
    #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
30.03.2011, 18:07
    #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
01.04.2011, 09:58
    #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
01.04.2011, 11:06
    #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
01.04.2011, 11:49
    #37193937
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с чисткой таблицы
Mark Barinsteinsegoff,

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



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


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