powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как стереть ЛОГ, если в нём нет надобности?
15 сообщений из 40, страница 2 из 2
Как стереть ЛОГ, если в нём нет надобности?
    #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
15 сообщений из 40, страница 2 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как стереть ЛОГ, если в нём нет надобности?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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