|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Я наполняю таблицу только один раз 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? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2005, 12:00 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Если от тебе такую фигню говорит, что лог полон, то значит ты его не отключила. утилитку db2 нужно запускать так: db2 -c- чтобы отключить автокоммит. Похоже у тебя после alter table ... сразу commit идет, и табличка так и остается logged... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2005, 10:18 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
А почему ты не хочешь воспользоваться LOAD from cursor. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2005, 14:05 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 записеи ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2005, 14:40 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
1)Как только commit сделаешь, табличка, которая была not logged , опять станет logged. Еще раз говорю - not logged действует до первого commit-a! 2)Если ты сделаешь табличку not logged, то к ней ни одна другая сессия не сможет обратиться. Она заблокируется эксклюзивно! 3)Внутри begin atomic... end - нельзя вставлять commit Следовательно (=>) сразу в одном блоке begin atomic... end вставляй все свои 100млн записей. Или пиши ХП! которая в цикле будет бахать commit через каждые 1000 записей. Честно говаря я уж устал все это объяснять. Скажи, какая структура у твоей таблицы, я те напишу скрипт на заполние тестовыми данными... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2005, 15:31 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
gardenman - это уже перебор.... Вместо удочки ты всучиваешь рыбку.... Так тебе придеться всех до конца дней кормить... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2005, 16:11 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2005, 15:04 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2005, 18:50 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Код: plaintext 1.
По Id существует индекс? В каком табличном пространстве располагается таблица? Какой буферпул привязан к табличному пространству? Каков размер этого буферпула? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 12:37 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
gardenman Код: plaintext 1.
По 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) @ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 13:09 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Напиши-те ка вот так: CREATE UNIQUE INDEX "INLAND_M000"."C1_ID" ON "INLAND_M000"."MyDBName_1" ("ID" ASC) ALLOW REVERSE SCANS; И покажите план запроса для (SELECT MAX(Id) FROM DestTable); до и после изменения индекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 13:14 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 @ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 13:28 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 @ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 13:56 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Когда процедура скомпилируется, то образуется связанный с ней пакет: Код: plaintext 1. 2. 3. 4. 5. 6.
Используя имя пакета можно глянуть каков пран запроса при помощи утилиты db2expln Я почти уверен что у вас там TBSCAN ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 14:13 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
А почему ты не хочешь воспользоваться рекуксивным расширением WITH. Легко можно сгенерировать случайные данные. Я приводил пример на 10000 человек. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 14:40 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Ничего страшного.. пусть делает одинаково для всех баз. Тут самый прикол как раз и заключается в использовании select MAX()... Хотя вместо этой фигни запросто можно было бы воспользоваться или SQUENCE или INDENTITY ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 14:47 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
nkulikovА почему ты не хочешь воспользоваться рекуксивным расширением WITH. Легко можно сгенерировать случайные данные. Я приводил пример на 10000 человек. -------------------- Да мне не нужно генерировать случайные данные,т.к. уже имеем таблицу с данными - 1000 записей. Не известно начальное значение Ид. Нужно размножить эти записи до 100 млн, чтобы Id не повторялся, т.е. если 1000 записеи уже имеются, то к мах Id прибавить 1000, чтобы получить след. Id ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 15:35 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 @ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 15:40 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
ну вообще-то, учитывая что есть индекс и свежая (!) статистика, max() срабатывает мухоментально. если же у вас для него приходиться шуршать по дискам делая tablescan, то куда уж. примерно так я понял gardenman'a и что самое удивительное - согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 15:50 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
а после вставки первой (и последующих) порций данных, у вас уже не свежая статистика (даже если и была таковой в начале). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 15:52 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Какая процедура выполняется? P_MillionRecPopulation(in EndNumOfRows integer) Какую процедру она вызывает? P_PopulateBy1000() Сколько раз она вызывается? 100000 В какой процедуре сторит select max()? в P_PopulateBy1000() Сколько раз выполняется select max()? 100000 .... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 16:08 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Какая процедура выполняется? P_MillionRecPopulation(in EndNumOfRows integer) Какую процедру она вызывает? P_PopulateBy1000() Сколько раз она вызывается? 100000 В какой процедуре сторит select max()? в P_PopulateBy1000() Сколько раз выполняется select max()? 100000 .... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 16:15 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
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 @ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 16:23 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
>CREATE BUFFERPOOL "BP_MyDBName_4K" SIZE 10000 PAGESIZE 4096 NOT EXTENDED STORAGE; 4096*10000 = 40M... маловато для таблички в 100 млн записей ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2005, 17:03 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#18+
Вообще много чего можно сделать чтобы ускорить работу: 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2005, 10:19 |
|
Как стереть ЛОГ, если в нём нет надобности?
|
|||
---|---|---|---|
#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?all=1&fid=43&tid=1605887]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 435ms |
0 / 0 |