|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
http://www-106.ibm.com/developerworks/db2/library/tips/dm-0403wilkins/index.html?ca=dnp-311 gardenman - мне только не понятно, по сравнению с затратами на собственно внесение данных, вызовы max() при всем правильном не должны быть заметны вообще. Или я чего-то не так понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 11:05 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
for insert only -> append on ? gardenman - я правильно мысль понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 11:07 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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; --------------------- Как это сделать отдельными командами, вроде ясно, а вот как все скомпоновать - вот в чем вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 12:06 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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; --------------------- Как это сделать отдельными командами, вроде ясно, а вот как все скомпоновать - вот в чем вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 12:09 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
У утилиты db2 есть ключ -r - который прекращает выполнение скрипта если случилась ошибка ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 12:30 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
ggvfor insert only -> append on ? gardenman - я правильно мысль понял ? аха... правильно.. я просто этим не пользуюсь... Я вообще DB2 не пользуюсь на работе... пока невозможно убедить начальство спрыгнуть с Sybase ASE, в которую вложены немеренные бабки, еще до моего прихода. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:05 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
gardenman - ну а про влияние max() почему не высказываешься? Интересно же ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:11 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
и вообще - чего то я не пойму никак, какие трудности с LOAD ? по-любому это самый предпочтительный способ для данной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:14 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
ggvи вообще - чего то я не пойму никак, какие трудности с LOAD ? по-любому это самый предпочтительный способ для данной задачи. ---------------- Учитывая условие, что имеются 1000 записей в таблице и не известно начальное значение Id, как бы вы написали это с LOAD, чтобы получить 100 млн записей? После запуска сообщу ,сколько времени это берет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:39 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
ggvgardenman - ну а про влияние max() почему не высказываешься? Интересно же про влияние MAX() можно было бы высказаться еслиб тут был приведен план запроса. Но его же не показали... Да и вообще вопросы типа "Что такое план запроса?" - говорят сами за себя... Специально для Toskana - разжовываю... DB2 при компиляции процедуры сразу формирует план запроса (то, каким макаром DB2 будет доставать нужные данные), он хранится в двоичном виде в таблице SYSPLANS. Этот план - статический, и не будет пересматриваться до тех пор, пока вы заново не перекомпилите процедуру. Например, если взять Оракла или МSSQL, то для того чтобы посмотреть "реальный" план, там нужно чтобы конкретная процедура работала. А в ДБ2 план уже известен заранее, потому -то SQL и называется - статический. Если вы хотите чтоб перед запуском процедуры DB2 перестраивала план на основе текущей статистики (как в Oracle или MSSQL), то процедура должна быть скомпилирована с опцией REOPT. Когда конкретно ставить эту опцию - зависит от ситуации. Если в вашем случае при компиляции запроса select max() - был выбран TBSCAN - сканирование таблицы или полностью всего индекса - то естесс-но - ниче хорошего. Это очень-очень долго... Поэтому индекс д.б просканирован в обратном порядке (с хвоста). чтоб сразу получить максимальное значение. Где-то еще была статья как ускорить инсерты, но ... нет у меня ссылки и искать не хочется.. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:47 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Toskana - если рекордсет для load может быть получени из select, то я бы делал load from cursor gardenman - да я не то имел ввиду. Я высказал мысль, что при наличии свежей статистики, нужного индекса, операция max() повторенная даже 10 000 раз займет незаметную долю времени по сравнению с самой операцией внесения данных. Только вот если загрузка идет в цикле, то после первой итерации цикла мы имеем устаревшую статистику. Опять же, это повод ипользовать load from cursor если нужный набор данных можно получить одним select ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 13:53 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
gardenman ggvgardenman - ну а про влияние max() почему не высказываешься? Интересно же про влияние MAX() можно было бы высказаться еслиб тут был приведен план запроса. Но его же не показали... Да и вообще вопросы типа "Что такое план запроса?" - говорят сами за себя... Специально для Toskana - разжовываю... DB2 при компиляции процедуры сразу формирует план запроса (то, каким макаром DB2 будет доставать нужные данные), он хранится в двоичном виде в таблице SYSPLANS. Этот план - статический, и не будет пересматриваться до тех пор, пока вы заново не перекомпилите процедуру. Например, если взять Оракла или МSSQL, то для того чтобы посмотреть "реальный" план, там нужно чтобы конкретная процедура работала. А в ДБ2 план уже известен заранее, потому -то SQL и называется - статический. Если вы хотите чтоб перед запуском процедуры DB2 перестраивала план на основе текущей статистики (как в Oracle или MSSQL), то процедура должна быть скомпилирована с опцией REOPT. Когда конкретно ставить эту опцию - зависит от ситуации. Если в вашем случае при компиляции запроса select max() - был выбран TBSCAN - сканирование таблицы или полностью всего индекса - то естесс-но - ниче хорошего. Это очень-очень долго... Поэтому индекс д.б просканирован в обратном порядке (с хвоста). чтоб сразу получить максимальное значение. Где-то еще была статья как ускорить инсерты, но ... нет у меня ссылки и искать не хочется.. ---------------- Да спасибо и так всем! Про INSERT ускоренный ссылку уже подбросили. А насчет Плана Запроса - я же сказала , что новичок в DB2 - поэтому и тусуюсь на этом форуме на уровне спрашивающих, а не отвечающих. Но главное, что есть начало не без вашего участия, а продолжение следует. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 14:34 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
ну по поводу плана выполнения запроса - легко 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 15:15 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 в коде? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2005, 16:21 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
А почему, интересно, мое сообщение включено в вопрос? Ведь между ними ничего общего - я же LOAD предложил, а ему журналы транзакций фиолоетово, он с ними не работает (в смысле данные в него не пишуться). Я таки настаиваю и приоритете LOAD перед INSERT для такой задачи :) По сути вопроса - если уж все insert не делаються в одной транзакции, то после каждого commit делайте alter table activate not logged initially. а чем LOAD не устраивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2005, 11:08 |
|
|
start [/forum/topic.php?fid=43&gotonew=1&tid=1605887]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
8ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 173ms |
0 / 0 |