powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как стереть ЛОГ, если в нём нет надобности?
40 сообщений из 40, показаны все 2 страниц
Как стереть ЛОГ, если в нём нет надобности?
    #33065744
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я наполняю таблицу только один раз 100 млн рекордсами. В таблице уже имеются 1000 рекордсов, которые мне нужно размножить.

Я отключила логирование след. командои:
alter table test activate not logged initially.

Вопрос: значит вставляем без записи в LOG, но он выдал сообщение, что LOG is full, а значит он писал все в LOG.

Как стереть переполненныи LOG, если он не содержит жизненно -важную инфу, чтобы продолжить игры со вставлением 100 млн . рекордсов
? В SQK Server есть опция:
Detachment and deleting of *.ldb file . Работа от этого не нарушается.

Имеется ли что-то подобное в ДБ2?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33066368
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если от тебе такую фигню говорит, что лог полон, то значит ты его не отключила. утилитку db2 нужно запускать так: db2 -c- чтобы отключить автокоммит. Похоже у тебя после alter table ... сразу commit идет,
и табличка так и остается logged...
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33067146
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему ты не хочешь воспользоваться LOAD from cursor.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33067285
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanЕсли от тебе такую фигню говорит, что лог полон, то значит ты его не отключила. утилитку db2 нужно запускать так: db2 -c- чтобы отключить автокоммит. Похоже у тебя после alter table ... сразу commit идет,
и табличка так и остается logged...

------------------------------

Запустила с alter table... без логирования, с отменой autocommit и явным commit внутри кода.

alter table test activate not logged initially - действует ли эта команда на таблицу с данными или нужно применять ее только после создания таблицы без данных?


В следующем коде имеется таблица test, в которои есть 1000 записей.
Нужно получить 100 млн записей. Запускаю цикл до 10000 записей и потом commit.


--------
alter table test activate not logged initially
@

BEGIN atomic

declare startRow integer default 0;
declare endRow integer default 0;
declare step integer default 0;
declare lastStep integer default 0;
declare currStep integer default 0;

set startRow = (SELECT MAX(ID) FROM test );
set endRow=10000;
set CountStep = endRow/startRow;

WHILE currStep < CountStep DO
INSERT INTO test(ID,TEXT)
SELECT ID+startRow,TEXT FROM test;
SET currStep = currStep+1;
SET startRow = startRow+1000;

END WHILE;
END
@
commit@

--------------------------

db2cmd db2 -v -td@ -f c:\test\test.sql
-----------------

Нужно запустить этот блок 10000 раз, чтобы получить 100 млн.
Как написать 2 вложенных цикла, чтобы commit делался только после вставки 10000 записеи ?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33067458
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)Как только commit сделаешь, табличка, которая была not logged , опять станет logged. Еще раз говорю - not logged действует до первого commit-a!

2)Если ты сделаешь табличку not logged, то к ней ни одна другая сессия не сможет обратиться. Она заблокируется эксклюзивно!

3)Внутри begin atomic... end - нельзя вставлять commit

Следовательно (=>) сразу в одном блоке begin atomic... end вставляй все свои 100млн записей. Или пиши ХП! которая в цикле будет бахать commit через каждые 1000 записей.

Честно говаря я уж устал все это объяснять.
Скажи, какая структура у твоей таблицы, я те напишу скрипт на заполние тестовыми данными...
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33067604
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
gardenman - это уже перебор....
Вместо удочки ты всучиваешь рыбку....
Так тебе придеться всех до конца дней кормить...
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079005
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman1)Как только commit сделаешь, табличка, которая была not logged , опять станет logged. Еще раз говорю - not logged действует до первого commit-a!

2)Если ты сделаешь табличку not logged, то к ней ни одна другая сессия не сможет обратиться. Она заблокируется эксклюзивно!

3)Внутри begin atomic... end - нельзя вставлять commit

Следовательно (=>) сразу в одном блоке begin atomic... end вставляй все свои 100млн записей. Или пиши ХП! которая в цикле будет бахать commit через каждые 1000 записей.

Честно говаря я уж устал все это объяснять.
Скажи, какая структура у твоей таблицы, я те напишу скрипт на заполние тестовыми данными...

------------------------------

Имеется SourceTable, в которои заданы 1000 записеи. Необходимо ими наполнить таблицу DestTable до 100 млн записей, изменяя 3 поля, что видно из следующего кода.
Имеются 2 процедуры - одна вставляет 1000 записей, а вторая - в цикле вызывает первую 100000 раз, чтобы получить 100 млн записей. Но все это берет 8 часов.
Выглядет все это не очень логично, ибо Oracle и SQL Server сделали это намного быстрее.
Как можно улучшить performance?

---------------P_PopulateBy1000
create procedure P_PopulateBy1000()
language SQL
MODIFIES SQL DATA
BEGIN
DECLARE startRow INTEGER DEFAULT 0;
SET startRow = (SELECT MAX(Id) FROM DestTable);


INSERT INTO DestTable (PermanentId, Id, F24, F32, F39, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23)
SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM SourceTable;
commit;
end
-----------------------P_MillionRecPopulation
create procedure P_MillionRecPopulation(in EndNumOfRows integer)
language SQL
MODIFIES SQL DATA
BEGIN
DECLARE startRow INTEGER DEFAULT 0;
DECLARE endRow INTEGER DEFAULT 0;
DECLARE step INTEGER DEFAULT 0;
DECLARE lastStep INTEGER DEFAULT 0;
DECLARE currStep INTEGER DEFAULT 0;


SET startRow = (SELECT MAX(Id) FROM DestTable);
SET endRow = EndNumOfRows;
SET lastStep = (endRow-startRow)/1000;


WHILE (currStep < lastStep) DO
call P_PopulateBy1000();
SET currStep = currStep+1;
SET startRow = startRow+1000;
END WHILE;

end
-----------------------
call P_MillionRecPopulation(100000000)
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079091
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toskana gardenman1)Как только commit сделаешь, табличка, которая была not logged , опять станет logged. Еще раз говорю - not logged действует до первого commit-a!

2)Если ты сделаешь табличку not logged, то к ней ни одна другая сессия не сможет обратиться. Она заблокируется эксклюзивно!

3)Внутри begin atomic... end - нельзя вставлять commit

Следовательно (=>) сразу в одном блоке begin atomic... end вставляй все свои 100млн записей. Или пиши ХП! которая в цикле будет бахать commit через каждые 1000 записей.

Честно говаря я уж устал все это объяснять.
Скажи, какая структура у твоей таблицы, я те напишу скрипт на заполние тестовыми данными...

------------------------------

Имеется SourceTable, в которои заданы 1000 записеи. Необходимо ими наполнить таблицу DestTable до 100 млн записей, изменяя 3 поля, что видно из следующего кода.
Имеются 2 процедуры - одна вставляет 1000 записей, а вторая - в цикле вызывает первую 100000 раз, чтобы получить 100 млн записей. Но все это берет 80 часов.
Выглядет все это не очень логично, ибо Oracle и SQL Server сделали это намного быстрее.
Как можно улучшить performance?

---------------P_PopulateBy1000
create procedure P_PopulateBy1000()
language SQL
MODIFIES SQL DATA
BEGIN
DECLARE startRow INTEGER DEFAULT 0;
SET startRow = (SELECT MAX(Id) FROM DestTable);


INSERT INTO DestTable (PermanentId, Id, F24, F32, F39, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23)
SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM SourceTable;
commit;
end
-----------------------P_MillionRecPopulation
create procedure P_MillionRecPopulation(in EndNumOfRows integer)
language SQL
MODIFIES SQL DATA
BEGIN
DECLARE startRow INTEGER DEFAULT 0;
DECLARE endRow INTEGER DEFAULT 0;
DECLARE step INTEGER DEFAULT 0;
DECLARE lastStep INTEGER DEFAULT 0;
DECLARE currStep INTEGER DEFAULT 0;


SET startRow = (SELECT MAX(Id) FROM DestTable);
SET endRow = EndNumOfRows;
SET lastStep = (endRow-startRow)/1000;


WHILE (currStep < lastStep) DO
call P_PopulateBy1000();
SET currStep = currStep+1;
SET startRow = startRow+1000;
END WHILE;

end
-----------------------
call P_MillionRecPopulation(100000000)
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079805
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
SET startRow = (SELECT MAX(Id) FROM DestTable);

По Id существует индекс?
В каком табличном пространстве располагается таблица?
Какой буферпул привязан к табличному пространству?
Каков размер этого буферпула?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079906
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman
Код: plaintext
1.
SET startRow = (SELECT MAX(Id) FROM DestTable);

По Id существует индекс?
В каком табличном пространстве располагается таблица?
Какой буферпул привязан к табличному пространству?
Каков размер этого буферпула?

-----------------------------
-- Database Name: MyDBName

CONNECT TO MyDBName;

------------------------------------

-- DDL Statements for BUFFERPOOLS --

------------------------------------

CREATE BUFFERPOOL "BP_MyDBName_4K" SIZE 10000 PAGESIZE 4096 NOT EXTENDED STORAGE;

CONNECT RESET;

CONNECT TO MyDBName;

------------------------------------

-- DDL Statements for TABLESPACES --

------------------------------------

CREATE REGULAR TABLESPACE TS_MyDBName IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY SYSTEM

USING ('C:\DBF\ts_MyDBName_m4')

EXTENTSIZE 32

PREFETCHSIZE 16

BUFFERPOOL BP_MyDBName_4K

OVERHEAD 24.100000

TRANSFERRATE 0.900000

DROPPED TABLE RECOVERY ON;

-- Mimic tablespace

ALTER TABLESPACE SYSCATSPACE

PREFETCHSIZE 16

OVERHEAD 24.100000

TRANSFERRATE 0.900000;


ALTER TABLESPACE TEMPSPACE1

PREFETCHSIZE 16

OVERHEAD 24.100000

TRANSFERRATE 0.900000;





------------------------------------------------

-- DDL Statements for table "INLAND_M000"."MyDBName_1"

------------------------------------------------



CREATE TABLE "INLAND_M000"."MyDBName_1" (

"PERMANENTID" INTEGER NOT NULL ,

"ID" INTEGER NOT NULL ,

"F24" INTEGER NOT NULL ,

"F32" INTEGER NOT NULL ,

"F39" INTEGER ,

"F36" SMALLINT ,

"F35" SMALLINT ,

"F1" VARCHAR(27) NOT NULL ,

"F26" VARCHAR(60) NOT NULL ,

"F27" VARCHAR(60) NOT NULL ,

"F28" VARCHAR(60) NOT NULL ,

"F29" VARCHAR(135) NOT NULL ,

"F30" VARCHAR(135) NOT NULL ,

"F31" VARCHAR(135) NOT NULL ,

"F20" VARCHAR(39) NOT NULL ,

"F34" VARCHAR(30) NOT NULL ,

"F21" VARCHAR(30) NOT NULL ,

"F22" VARCHAR(75) NOT NULL ,

"F37" VARCHAR(60) NOT NULL ,

"F38" VARCHAR(3) NOT NULL ,

"F23" VARCHAR(75) NOT NULL )

IN "TS_MyDBName" ;

ALTER TABLE "INLAND_M000"."MyDBName_1" VOLATILE CARDINALITY;



-- DDL Statements for indexes on Table "INLAND_M000"."MyDBName_1"


CREATE UNIQUE INDEX "INLAND_M000"."C1_ID" ON "INLAND_M000"."MyDBName_1"

("ID" ASC);


-- DDL Statements for indexes on Table "INLAND_M000"."MyDBName_1"


CREATE INDEX "INLAND_M000"."I1_F24" ON "INLAND_M000"."MyDBName_1"

("F24" ASC);


-- DDL Statements for indexes on Table "INLAND_M000"."MyDBName_1"


CREATE INDEX "INLAND_M000"."I1_F32" ON "INLAND_M000"."MyDBName_1"

("F32" ASC);


-- DDL Statements for indexes on Table "INLAND_M000"."MyDBName_1"


CREATE UNIQUE INDEX "INLAND_M000"."I1_PERMID" ON "INLAND_M000"."MyDBName_1"

("PERMANENTID" ASC);

COMMIT WORK;

CONNECT RESET;

TERMINATE;

-- Generate statistics for all creators

-- The db2look utility will consider only the specified tables

-- Creating DDL for table(s)

@
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079925
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши-те ка вот так:
CREATE UNIQUE INDEX "INLAND_M000"."C1_ID" ON "INLAND_M000"."MyDBName_1" ("ID" ASC) ALLOW REVERSE SCANS;

И покажите план запроса для (SELECT MAX(Id) FROM DestTable); до и после изменения индекса.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33079958
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanНапиши-те ка вот так:
CREATE UNIQUE INDEX "INLAND_M000"."C1_ID" ON "INLAND_M000"."MyDBName_1" ("ID" ASC) ALLOW REVERSE SCANS;

И покажите план запроса для (SELECT MAX(Id) FROM DestTable); до и после изменения индекса.

-----------------
Что такое план запроса?
Можно на англицком, пжл-ста.

Можно попробовать с курсором, но не проходит такой батч:

BEGIN ATOMIC

declare startRow integer default 0;
declare endRow integer default 0;
declare step integer default 0;
declare lastStep integer default 0;
declare currStep integer default 0;

set startRow = (SELECT MAX(Id) FROM My_Scheme.MyTable_1);
set endRow=5701000;
set lastStep = (endRow-startRow)/1000;

WHILE currStep < lastStep DO
DECLARE myCurs CURSOR FOR SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM My_Scheme.MyTable_1_1K;
LOAD FROM myCurs OF cursor INSERT INTO My_Scheme.MyTable_1;
SET currStep = currStep+1;
SET startRow = startRow+1000;

END WHILE;
END
@
commit
@
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080036
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nkulikovА почему ты не хочешь воспользоваться LOAD from cursor.

--------------

Я очень хочу, но следующий код не проходит
BEGIN ATOMIC

declare startRow integer default 0;
declare endRow integer default 0;
declare step integer default 0;
declare lastStep integer default 0;
declare currStep integer default 0;

set startRow = (SELECT MAX(Id) FROM My_Scheme.MyTable_1);
set endRow=5701000;
set lastStep = (endRow-startRow)/1000;

WHILE currStep < lastStep DO
DECLARE myCurs CURSOR FOR SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM My_Scheme.MyTable_1_1K;
LOAD FROM myCurs OF cursor INSERT INTO My_Scheme.MyTable_1;
SET currStep = currStep+1;
SET startRow = startRow+1000;

END WHILE;
END
@
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080111
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда процедура скомпилируется, то образуется связанный с ней пакет:
Код: plaintext
1.
2.
3.
4.
5.
6.
select 
   substr(rtrim(routinename)||'.'||rtrim(routineSCHEMA), 1 , 30 ) PROC_NAME,
   'P'||char(LIB_ID) PACKAGE_NAME
from 
   syscat.ROUTINES
@

Используя имя пакета можно глянуть каков пран запроса при помощи утилиты db2expln

Я почти уверен что у вас там TBSCAN
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080210
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему ты не хочешь воспользоваться рекуксивным расширением WITH. Легко можно сгенерировать случайные данные. Я приводил пример на 10000 человек.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080231
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего страшного.. пусть делает одинаково для всех баз.
Тут самый прикол как раз и заключается в использовании select MAX()...
Хотя вместо этой фигни запросто можно было бы воспользоваться или SQUENCE или INDENTITY
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080341
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nkulikovА почему ты не хочешь воспользоваться рекуксивным расширением WITH. Легко можно сгенерировать случайные данные. Я приводил пример на 10000 человек.

--------------------

Да мне не нужно генерировать случайные данные,т.к. уже имеем таблицу с данными - 1000 записей.
Не известно начальное значение Ид.
Нужно размножить эти записи до 100 млн, чтобы Id не повторялся, т.е. если 1000 записеи уже имеются, то к мах Id прибавить 1000, чтобы получить след. Id
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080352
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanНичего страшного.. пусть делает одинаково для всех баз.
Тут самый прикол как раз и заключается в использовании select MAX()...
Хотя вместо этой фигни запросто можно было бы воспользоваться или SQUENCE или INDENTITY

---------------------

Поясните про прикол поподробнее.
В чем же прикол, если Batch, в котором Мах(Id) ищется только один раз, для размножения до 1 млн записей берет 1 час, то че там говорить о 100 млн

BEGIN ATOMIC

declare startRow integer default 0;
declare endRow integer default 0;
declare step integer default 0;
declare lastStep integer default 0;
declare currStep integer default 0;

set startRow = (SELECT MAX(Id) FROM MyScheme.MyTable);
set endRow=1000000;
set lastStep = (endRow-startRow)/1000;

WHILE currStep < lastStep DO
INSERT INTO MyScheme.MyTable (PermanentId, Id, F24, F32, F39, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23)
SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM MyScheme.MyTable_1K;
SET currStep = currStep+1;
SET startRow = startRow+1000;

END WHILE;
END
@
commit
@
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080381
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
ну вообще-то, учитывая что есть индекс и свежая (!) статистика, max() срабатывает мухоментально.
если же у вас для него приходиться шуршать по дискам делая tablescan, то куда уж.
примерно так я понял gardenman'a
и что самое удивительное - согласен
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080386
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
а после вставки первой (и последующих) порций данных, у вас уже не свежая статистика (даже если и была таковой в начале).
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080430
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая процедура выполняется?
P_MillionRecPopulation(in EndNumOfRows integer)
Какую процедру она вызывает?
P_PopulateBy1000()
Сколько раз она вызывается?
100000
В какой процедуре сторит select max()?
в P_PopulateBy1000()
Сколько раз выполняется select max()?
100000
....
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080443
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая процедура выполняется?
P_MillionRecPopulation(in EndNumOfRows integer)
Какую процедру она вызывает?
P_PopulateBy1000()
Сколько раз она вызывается?
100000
В какой процедуре сторит select max()?
в P_PopulateBy1000()
Сколько раз выполняется select max()?
100000
....
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080461
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanКакая процедура выполняется?
P_MillionRecPopulation(in EndNumOfRows integer)
Какую процедру она вызывает?
P_PopulateBy1000()
Сколько раз она вызывается?
100000
В какой процедуре сторит select max()?
в P_PopulateBy1000()
Сколько раз выполняется select max()?
100000
....

-------------------
Ну да, все правильно в случае с процедурами.

А если без них обойтись только батчем, и с autocommit и без него для вставки 1 млн записей требуется 1 час.

BEGIN ATOMIC

declare startRow integer default 0;
declare endRow integer default 0;
declare step integer default 0;
declare lastStep integer default 0;
declare currStep integer default 0;

set startRow = (SELECT MAX(Id) FROM MyScheme.MyTable);
set endRow=1000000;
set lastStep = (endRow-startRow)/1000;

WHILE currStep < lastStep DO
INSERT INTO MyScheme.MyTable (PermanentId, Id, F24, F32, F39, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23)
SELECT Id+startRow, Id+startRow, F24, F32, Id+startRow, F36, F35, F1, F26, F27, F28, F29, F30, F31, F20, F34, F21, F22, F37, F38, F23 FROM MyScheme.MyTable_1K;
SET currStep = currStep+1;
SET startRow = startRow+1000;

END WHILE;
END
@
commit
@
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33080568
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>CREATE BUFFERPOOL "BP_MyDBName_4K" SIZE 10000 PAGESIZE 4096 NOT EXTENDED STORAGE;

4096*10000 = 40M... маловато для таблички в 100 млн записей
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081378
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще много чего можно сделать чтобы ускорить работу:
1) MANAGED BY SYSTEM - Лучше сделать MANAGED BY DATABASE, например у ORACLE и MSSQL вообще нет ничего подобного MANAGED BY SYSTEM
2) Я не знаю как вы создавали базу данных. Лог и контейнеры нужно разнести по дискам, если есть возможность. И, если есть возможность разнести по дискам собственно табличку и ее индексы. Т.е. в идеали у нас должно быть 4 диска - для таблицы, для индексов, для лога и и для системы
3) В DB2 имеются таблички FOR INSERT ONLY
4) когда создаете индексы и таблицу, то делать их нужно в разных табличных пространствах, и соответственно привязывать к разным буферпулам.
5) на табличку, в которой 1000 исходных записей создайте отдельное табличное пространство и, соответственно свой буферпул, чтобы она не вымывалась из кэша.
6) ну, и естественно в зависимости от размера памяти на вашем компьютере,
примерно 75% отдайте под буферпулы DB2
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081537
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
http://www-106.ibm.com/developerworks/db2/library/tips/dm-0403wilkins/index.html?ca=dnp-311

gardenman - мне только не понятно, по сравнению с затратами на собственно внесение данных, вызовы max() при всем правильном не должны быть заметны вообще.
Или я чего-то не так понимаю.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081546
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
for insert only -> append on ?
gardenman - я правильно мысль понял ?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081718
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanВообще много чего можно сделать чтобы ускорить работу:
1) MANAGED BY SYSTEM - Лучше сделать MANAGED BY DATABASE, например у ORACLE и MSSQL вообще нет ничего подобного MANAGED BY SYSTEM
2) Я не знаю как вы создавали базу данных. Лог и контейнеры нужно разнести по дискам, если есть возможность. И, если есть возможность разнести по дискам собственно табличку и ее индексы. Т.е. в идеали у нас должно быть 4 диска - для таблицы, для индексов, для лога и и для системы
3) В DB2 имеются таблички FOR INSERT ONLY
4) когда создаете индексы и таблицу, то делать их нужно в разных табличных пространствах, и соответственно привязывать к разным буферпулам.
5) на табличку, в которой 1000 исходных записей создайте отдельное табличное пространство и, соответственно свой буферпул, чтобы она не вымывалась из кэша.
6) ну, и естественно в зависимости от размера памяти на вашем компьютере,
примерно 75% отдайте под буферпулы DB2

-------------------------------------
Вот читаю интересную статейку как раз про то , о чем вы написали:
http://www.quest-pipelines.com/newsletter-v5/1004_D.htm

Да вот такой простой Batch используется для создания DB. Что можно улучшить и как создать отдельный BP для таблицы, в которой 1000 исходных записей?
Как создать индексы и таблицы в разных табличных пространствах?
-----------------------------------
"create db MyDBName using codeset utf-8 territory us collate using identity_16bit"
-- create database MyDBName on C;

connect to MyDBName;
create bufferpool BP_MyDBName_32K size 2500 pagesize 32k;
create bufferpool BP_MyDBName_4K size 10000 pagesize 4k;
disconnect MyDBName;
stop database manager;
start database manager;
connect to MyDBName;
drop tablespace USERSPACE1;

create system temporary tablespace TSS_32k pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_ts32') bufferpool BP_MyDBName_32K;

create user temporary tablespace TSU_32k pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_tu32') bufferpool BP_MyDBName_32K;

-- Change 4k/4096 to 32k if needed
create tablespace TS_MyDBName pagesize 4096 managed by system using ('C:\DBF\ts_MyDBName_m4') bufferpool BP_MyDBName_4K;

create tablespace TS_MyDBNameL pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_b32') bufferpool BP_MyDBName_32K;

create tablespace TS_MyDBNameX pagesize 4096 managed by system using ('C:\DBF\ts_MyDBName_x4') bufferpool BP_MyDBName_4K;

list tablespaces;



grant use of tablespace TSS_32k to user db2admin;
grant use of tablespace TSU_32k to user db2admin;
grant use of tablespace TS_MyDBName to user db2admin;
grant use of tablespace TS_MyDBNameL to user db2admin;
grant use of tablespace TS_MyDBNameX to user db2admin;
disconnect MyDBName;

update db cfg for MyDBName using logprimary 25 logsecond 100 logfilsiz 2000;
update db cfg for MyDBName using LOCKLIST 128 MAXLOCKS 25;

stop database manager;
update dbm cfg using query_heap_sz 3200;
start database manager;
update dbm cfg using query_heap_sz 3200;
stop database manager;
start database manager;

terminate;
---------------------
Как это сделать отдельными командами, вроде ясно, а вот как все скомпоновать - вот в чем вопрос?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081735
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanВообще много чего можно сделать чтобы ускорить работу:
1) MANAGED BY SYSTEM - Лучше сделать MANAGED BY DATABASE, например у ORACLE и MSSQL вообще нет ничего подобного MANAGED BY SYSTEM
2) Я не знаю как вы создавали базу данных. Лог и контейнеры нужно разнести по дискам, если есть возможность. И, если есть возможность разнести по дискам собственно табличку и ее индексы. Т.е. в идеали у нас должно быть 4 диска - для таблицы, для индексов, для лога и и для системы
3) В DB2 имеются таблички FOR INSERT ONLY
4) когда создаете индексы и таблицу, то делать их нужно в разных табличных пространствах, и соответственно привязывать к разным буферпулам.
5) на табличку, в которой 1000 исходных записей создайте отдельное табличное пространство и, соответственно свой буферпул, чтобы она не вымывалась из кэша.
6) ну, и естественно в зависимости от размера памяти на вашем компьютере,
примерно 75% отдайте под буферпулы DB2

--------------------------------
Вот читаю интересную статейку как раз про то , о чем вы написали:
http://www.quest-pipelines.com/newsletter-v5/1004_D.htm

Да вот такой простой Batch используется для создания DB. Что можно улучшить и как создать отдельный BP для таблицы, в которой 1000 исходных записей?
Как создать индексы и таблицы в разных табличных пространствах?
-----------------------------------
"create db MyDBName using codeset utf-8 territory us collate using identity_16bit"
-- create database MyDBName on C;

connect to MyDBName;
create bufferpool BP_MyDBName_32K size 2500 pagesize 32k;
create bufferpool BP_MyDBName_4K size 10000 pagesize 4k;
disconnect MyDBName;
stop database manager;
start database manager;
connect to MyDBName;
drop tablespace USERSPACE1;

create system temporary tablespace TSS_32k pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_ts32') bufferpool BP_MyDBName_32K;

create user temporary tablespace TSU_32k pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_tu32') bufferpool BP_MyDBName_32K;

-- Change 4k/4096 to 32k if needed
create tablespace TS_MyDBName pagesize 4096 managed by system using ('C:\DBF\ts_MyDBName_m4') bufferpool BP_MyDBName_4K;

create tablespace TS_MyDBNameL pagesize 32768 managed by system using ('C:\DBF\ts_MyDBName_b32') bufferpool BP_MyDBName_32K;

create tablespace TS_MyDBNameX pagesize 4096 managed by system using ('C:\DBF\ts_MyDBName_x4') bufferpool BP_MyDBName_4K;

list tablespaces;



grant use of tablespace TSS_32k to user db2admin;
grant use of tablespace TSU_32k to user db2admin;
grant use of tablespace TS_MyDBName to user db2admin;
grant use of tablespace TS_MyDBNameL to user db2admin;
grant use of tablespace TS_MyDBNameX to user db2admin;
disconnect MyDBName;

update db cfg for MyDBName using logprimary 25 logsecond 100 logfilsiz 2000;
update db cfg for MyDBName using LOCKLIST 128 MAXLOCKS 25;

stop database manager;
update dbm cfg using query_heap_sz 3200;
start database manager;
update dbm cfg using query_heap_sz 3200;
stop database manager;
start database manager;

terminate;
---------------------
Как это сделать отдельными командами, вроде ясно, а вот как все скомпоновать - вот в чем вопрос?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081841
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У утилиты db2 есть ключ -r - который прекращает выполнение скрипта если случилась ошибка
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081961
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggvfor insert only -> append on ?
gardenman - я правильно мысль понял ?
аха... правильно.. я просто этим не пользуюсь...
Я вообще DB2 не пользуюсь на работе... пока невозможно убедить начальство спрыгнуть с Sybase ASE, в которую вложены немеренные бабки, еще до моего прихода.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081979
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
gardenman - ну а про влияние max() почему не высказываешься? Интересно же
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33081992
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
и вообще - чего то я не пойму никак, какие трудности с LOAD ?
по-любому это самый предпочтительный способ для данной задачи.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33082078
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ggvи вообще - чего то я не пойму никак, какие трудности с LOAD ?
по-любому это самый предпочтительный способ для данной задачи.

----------------
Учитывая условие, что имеются 1000 записей в таблице и не известно начальное значение Id, как бы вы написали это с LOAD, чтобы получить 100 млн записей? После запуска сообщу ,сколько времени это берет
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33082101
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggvgardenman - ну а про влияние max() почему не высказываешься? Интересно же


про влияние MAX() можно было бы высказаться еслиб тут был приведен план запроса. Но его же не показали... Да и вообще вопросы типа "Что такое план запроса?" - говорят сами за себя...


Специально для Toskana - разжовываю...
DB2 при компиляции процедуры сразу формирует план запроса (то, каким макаром DB2 будет доставать нужные данные), он хранится в двоичном виде в таблице SYSPLANS. Этот план - статический, и не будет пересматриваться до тех пор, пока вы заново не перекомпилите процедуру.
Например, если взять Оракла или МSSQL, то для того чтобы посмотреть "реальный" план, там нужно чтобы конкретная процедура работала. А в ДБ2 план уже известен заранее, потому -то SQL и называется - статический. Если вы хотите чтоб перед запуском процедуры DB2 перестраивала план на основе текущей статистики (как в Oracle или MSSQL), то процедура должна быть скомпилирована с опцией REOPT. Когда конкретно ставить эту опцию - зависит от ситуации.
Если в вашем случае при компиляции запроса select max() - был выбран TBSCAN - сканирование таблицы или полностью всего индекса - то естесс-но - ниче хорошего. Это очень-очень долго... Поэтому индекс д.б просканирован в обратном порядке (с хвоста). чтоб сразу получить максимальное значение.
Где-то еще была статья как ускорить инсерты, но ... нет у меня ссылки и искать не хочется..
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33082120
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
Toskana - если рекордсет для load может быть получени из select, то я бы делал load from cursor

gardenman - да я не то имел ввиду. Я высказал мысль, что при наличии свежей статистики, нужного индекса, операция max() повторенная даже 10 000 раз займет незаметную долю времени по сравнению с самой операцией внесения данных.
Только вот если загрузка идет в цикле, то после первой итерации цикла мы имеем устаревшую статистику. Опять же, это повод ипользовать load from cursor если нужный набор данных можно получить одним select
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33082231
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman ggvgardenman - ну а про влияние max() почему не высказываешься? Интересно же


про влияние MAX() можно было бы высказаться еслиб тут был приведен план запроса. Но его же не показали... Да и вообще вопросы типа "Что такое план запроса?" - говорят сами за себя...


Специально для Toskana - разжовываю...
DB2 при компиляции процедуры сразу формирует план запроса (то, каким макаром DB2 будет доставать нужные данные), он хранится в двоичном виде в таблице SYSPLANS. Этот план - статический, и не будет пересматриваться до тех пор, пока вы заново не перекомпилите процедуру.
Например, если взять Оракла или МSSQL, то для того чтобы посмотреть "реальный" план, там нужно чтобы конкретная процедура работала. А в ДБ2 план уже известен заранее, потому -то SQL и называется - статический. Если вы хотите чтоб перед запуском процедуры DB2 перестраивала план на основе текущей статистики (как в Oracle или MSSQL), то процедура должна быть скомпилирована с опцией REOPT. Когда конкретно ставить эту опцию - зависит от ситуации.
Если в вашем случае при компиляции запроса select max() - был выбран TBSCAN - сканирование таблицы или полностью всего индекса - то естесс-но - ниче хорошего. Это очень-очень долго... Поэтому индекс д.б просканирован в обратном порядке (с хвоста). чтоб сразу получить максимальное значение.
Где-то еще была статья как ускорить инсерты, но ... нет у меня ссылки и искать не хочется..

----------------
Да спасибо и так всем!
Про INSERT ускоренный ссылку уже подбросили.
А насчет Плана Запроса - я же сказала , что новичок в DB2 - поэтому и тусуюсь на этом форуме на уровне спрашивающих, а не отвечающих. Но главное, что есть начало не без вашего участия, а продолжение следует.
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33082341
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
ну по поводу плана выполнения запроса - легко
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.doc/core/r0005736.htm

Но лучше не INSERT а LOAD

ну что-то типа

-- update db cfg using CHNGPGS_THRESH 5;
-- it requires all clients to disconnect from a database to get change applied
-- it has to be done in before the main body of the script

create bufferpool testbf immediate size 512 numblockpages 400 blocksize 4 pagesize 4K;
-- the size have been chosen to be about 1/5 of the data size

create regular tablespace testtb managed by database
using (device '/dev/raw/raw1' 100M)
bufferpool testbf;
-- it is linux platform, that's why I use /dev/raw with LVM

create table test (id int not null primary key, data float not null) in testtb;

declare cur1 cursor for with tmp(id, data) as
(select 1, 1 from sysibm.sysdummy1
union all
select id+1, rand() from tmp where tmp.id < 1000000)
select * from tmp ;
;

load from cur1 of cursor savecount 10000 insert into test;
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33089450
Toskana2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ggvну по поводу плана выполнения запроса - легко
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.doc/core/r0005736.htm

Но лучше не INSERT а LOAD

ну что-то типа

-- update db cfg using CHNGPGS_THRESH 5;
-- it requires all clients to disconnect from a database to get change applied
-- it has to be done in before the main body of the script

create bufferpool testbf immediate size 512 numblockpages 400 blocksize 4 pagesize 4K;
-- the size have been chosen to be about 1/5 of the data size

create regular tablespace testtb managed by database
using (device '/dev/raw/raw1' 100M)
bufferpool testbf;
-- it is linux platform, that's why I use /dev/raw with LVM

create table test (id int not null primary key, data float not null) in testtb;

declare cur1 cursor for with tmp(id, data) as
(select 1, 1 from sysibm.sysdummy1
union all
select id+1, rand() from tmp where tmp.id < 1000000)
select * from tmp ;
;

load from cur1 of cursor savecount 10000 insert into test;

------------------------


1. После создания таблицы отключается логгирование:
ALTER TABLE "INLAND_M001"."A2I_1" ACTIVATE NOT LOGGED INITIALLY@

2. Затем отключается AUTOCOMMIT в коммандной строке:

3. Но после вставки 10 тыс строк. т.е. после первого COMMITA опять начинается логгирование

Как выключить AUTOCOMMIT в процессе INSERT в коде?
...
Рейтинг: 0 / 0
Как стереть ЛОГ, если в нём нет надобности?
    #33090149
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
А почему, интересно, мое сообщение включено в вопрос?
Ведь между ними ничего общего - я же LOAD предложил, а ему журналы транзакций фиолоетово, он с ними не работает (в смысле данные в него не пишуться).
Я таки настаиваю и приоритете LOAD перед INSERT для такой задачи :)

По сути вопроса - если уж все insert не делаються в одной транзакции, то после каждого commit делайте alter table activate not logged initially.

а чем LOAD не устраивает?
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как стереть ЛОГ, если в нём нет надобности?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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