execute statement

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

execute statement

Сообщение nevadimka » 25 фев 2010, 18:05

Значит так в процедуре сначала идет:
execute statement 'create table A (...)';
а потом идет
execute statement 'insert into table A (...)values(...)';
и вот при запуске процедуры на инсерт ругается Table unknown.
Что нужно сделать чтобы не ругалось?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 25 фев 2010, 23:24

Что нужно сделать чтобы не ругалось?
прекратить вызывать DDL в Execute Statement. Зачем такие извраты?

nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

Re: execute statement

Сообщение nevadimka » 26 фев 2010, 10:41

мне нужно создавать контрольные точки состояния таблицы на дату(то есть там будет А_01012010) и складывать все в одну таблицу вариант не подходит.
Я так понимаю эту проблему можно обойти только так: создание таблицы запихнуть в одну процедуру, а инсерты в другую.
Или же акие извраты можно как-то вместе выполнить?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 26 фев 2010, 12:22

почему нельзя создать таблицу с клиента?
таблицы на дату(то есть там будет А_01012010)
правильно сортируется только японский формат даты - yyyymmdd, а не та фигня, что Вы написали. Рекомендую поменять, пока не поздно.

nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

Re: execute statement

Сообщение nevadimka » 26 фев 2010, 13:52

Посмотрели, подумали и решили, что наверное правильнее будет разбить на 2 процедуры.
За дату спасибо. Тему можно закрыть. Чет не могу найти где ее закрыть

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: execute statement

Сообщение Dimitry Sibiryakov » 26 фев 2010, 14:32

nevadimka писал(а):складывать все в одну таблицу вариант не подходит.
По религиозным мотивам?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 26 фев 2010, 15:02

Тему можно закрыть. Чет не могу найти где ее закрыть
не парьтесь. темы закрывают тут только модераторы. и лично я темы действительно закрываю очень редко.

Насчет глубокого смысла с разделением данных по таблицам советую подумать. "Состояние таблицы на дату" это весьма странная идея. Обычно если в данных интересует дата, то дата уже является столбцом таблицы. А с размерами таблиц у ФБ проблем нет.

nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

Re: execute statement

Сообщение nevadimka » 26 фев 2010, 15:33

Проблема в том что прибольших обьемах таблицы вставка в нее замедляется и решили сделать архивную, чтобы боевая таблица была все время небольшого размера. И когда она выростает перекидывать данные в архивную. И какбы что бы после такого получить результат, процес выглядит следующим образом: дропаем индексы, переносим инфо, делаем бекап/рестор, создаем индексы. А это по времени очень долго и производственый процесс стоит. По-этому решили делать много таблиц. Я против, заказчик требует))

Пробовал почитать вашу статью http://www.ibase.ru/devinfo/fb1tbtech.htm, чтобы привести хоть какие-то аргументы против, но тяжело воспринимается. Может вы свои мысли напишите на такой вот случай:
Таблица А - размер около 50Гб и таблица Б - размер припустим 1Гб
и нужно вставить 1млн записей, какой приблизительно будет выигрыш во времени привставке в таблицу Б

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 26 фев 2010, 16:24

Проблема в том что прибольших обьемах таблицы вставка в нее замедляется
1. что значит "большие объемы"?
2. насколько замедляется?

причин замедления может быть несколько - большое количество индексов, select или вызовы процедур в триггерах на вставку, check constraints в виде select, и т.д.
Попытайтесь изложить условия задачи максимально полно, т.к. непонятно, что Вы делаете, и как получается.
дропаем индексы, переносим инфо, делаем бекап/рестор, создаем индексы.
ужас.
и нужно вставить 1млн записей, какой приблизительно будет выигрыш во времени привставке в таблицу Б
никакой, если на этих таблицах не будет всякого шлака, о котором я написал выше. В плохо разработанной БД, например, если в триггере на вставку есть select, производительность вставки может замедляться пропорционально количеству записей. Я теоретизирую, потому что все зависит от этого select.
Поэтому такие таблицы, в которые вставляется масса данных, должны быть вычищены от любых действительно замедляющих действий.
но тяжело воспринимается.
гм, что тяжело воспринимается? статья написана предельно простым языком, да и весь тест проще некуда.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: execute statement

Сообщение Dimitry Sibiryakov » 27 фев 2010, 13:50

kdv писал(а):
и нужно вставить 1млн записей, какой приблизительно будет выигрыш во времени привставке в таблицу Б
никакой, если на этих таблицах не будет всякого шлака, о котором я написал выше.
Не совсем так. Pointer pages при поиске места под вставку сканируются последовательно. Так что если в таблицу идут только вставки и никогда - удаления, то время вставки будет расти с увеличением таблицы. Я бы от балды назвал цифру в 10-20%. Тут многое зависит от размера записи, размера страницы, нагрузки и т.д. и т.п.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: execute statement

Сообщение hvlad » 27 фев 2010, 15:10

Dimitry Sibiryakov писал(а):Pointer pages при поиске места под вставку сканируются последовательно. Так что если в таблицу идут только вставки и никогда - удаления, то время вставки будет расти с увеличением таблицы. Я бы от балды назвал цифру в 10-20%. Тут многое зависит от размера записи, размера страницы, нагрузки и т.д. и т.п.
Не нужно делать непроверенных и неправильных утверждений. Тем более от балды

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 27 фев 2010, 21:09

Я бы от балды назвал цифру в 10-20%.
см. статистику по скорости вставки на моем тесте терабайтной БД.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: execute statement

Сообщение Dimitry Sibiryakov » 28 фев 2010, 13:36

hvlad писал(а):Не нужно делать непроверенных и неправильных утверждений. Тем более от балды
Мнда, опять я сел в лужу... А патч опять надо рихтовать, чтобы в конце каждой РР не оставалось ссылок на недоиспользованные страницы. А может и не надо... Всё равно в супере доступ сериализуется, а в классике новый коннект таки сканирует страницы с начала, хоть и один раз.

nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

Re: execute statement

Сообщение nevadimka » 01 мар 2010, 12:10

Может вам будет интересно.

Так выложу инфо к сведенью, что могу и что мне известно.
В таблицу идет только вставка, апдейтов и удалений нет. Триггеров нет. Вот в принципе ддл:

Код: Выделить всё

CREATE TABLE AC (
    ACID      INTEGER NOT NULL,
    TRID         INTEGER NOT NULL,
    DID          INTEGER NOT NULL,
    CID          INTEGER NOT NULL,
    AMT          DOUBLE PRECISION NOT NULL,
    CCY          CHAR(3) NOT NULL,
    ODATE        DATE NOT NULL,
    REALDAT      DATE default 'TODAY' NOT NULL,
    COMMENTS     VARCHAR(160),
    INID         INTEGER,
    AMID         INTEGER NOT NULL,
    CAMID        INTEGER
);

ALTER TABLE AC ADD CONSTRAINT PK_AC PRIMARY KEY (AC);

CREATE INDEX IND_AC_COPD ON AC (CID, ODATE);
CREATE INDEX IND_AC_DOPD ON AC (DID, ODATE);
CREATE INDEX IND_AC_INID ON AC (INID);
CREATE INDEX IND_AC_ODATE ON AC (ODATE);
За день идет вставка около 2 млн записей, при чем если 1 млн на протяжении дня, то второй в конце, где и есть критичность времени.
Когда таблица перевалила за 40 Гб, то создали вторую и вставку делали туда. выиграли порядка 15 минут, что где-то и есть 10-20 %. Потом разбили еще одну таблицу ну и тоже получили выигрыш во времени.
Сервер Классик 2.0.5 стоит на Линуксе РХ с железом все в полном порядке. БД около 300Гб или даже больше

Ну так проблема вылезла в другом, что не хватает времени на переливку с текущей таблицы в архивную, так как выходных не хватает на бекап/рестор.
Потому и решили например делать таблицу раз в квартал. На этой таблице завязано очень много процедур, по этому и пытаемся что-то придумать через execute statement.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: execute statement

Сообщение kdv » 01 мар 2010, 12:38

так как выходных не хватает на бекап/рестор.
а зачем вы b/r делаете? И сколько времени занимает бэкап, и сколько рестор, по отдельности?

Есть-ли смысл хранить все в одной БАЗЕ? То есть, чем оправданы мучения с 300гиг базой, при условии хранения данных "с датчиков"?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: execute statement

Сообщение hvlad » 01 мар 2010, 12:42

nevadimka писал(а):За день идет вставка около 2 млн записей, при чем если 1 млн на протяжении дня, то второй в конце, где и есть критичность времени.
Когда таблица перевалила за 40 Гб, то создали вторую и вставку делали туда. выиграли порядка 15 минут, что где-то и есть 10-20 %. Потом разбили еще одну таблицу ну и тоже получили выигрыш во времени.
Ну так 5 индексов на таблице, конечно не будет такое летать. Они небось после первого млн ещё и по диску размазаны, вот и начинает притормаживать вставка.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: execute statement

Сообщение hvlad » 01 мар 2010, 12:45

Если уж ТАК сильно печёт и по другому не получается - сделайте себе таблиц на 5 лет вперёд :-D

nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

Re: execute statement

Сообщение nevadimka » 01 мар 2010, 13:07

Та да создать ручками это не проблема. хоть на десять лет. Если продавать функционал,то нужно чтобы все было автоматизировано, а то скажут, что заплатили денюжку и еще вручную талицы создают.
Чтобы хранить это в другой БД, а к этому все движется, так нужно сначала сделать вот этот механизм архивирования, так как одна запись тащит за собой по вторичному ключу вторую и т.д., плюс нужно переписывать процедуры и ПО.
А так проблема изначально была, чтобы запихнуть create и insert в одну процедуру, но от этого отказались и перенос данных решили делать порциями а не сразу всю.

Всем спасибо за советы и ответы

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: execute statement

Сообщение Dimitry Sibiryakov » 01 мар 2010, 13:42

nevadimka писал(а):За день идет вставка около 2 млн записей, при чем если 1 млн на протяжении дня, то второй в конце, где и есть критичность времени.
Когда таблица перевалила за 40 Гб, то создали вторую и вставку делали туда. выиграли порядка 15 минут, что где-то и есть 10-20 %. Потом разбили еще одну таблицу ну и тоже получили выигрыш во времени.
Сервер Классик 2.0.5 стоит на Линуксе РХ с железом все в полном порядке. БД около 300Гб или даже больше
Э-э-э... При вставке миллиона записей выйграли 15 минут?.. А сколько вообще у вас этот миллион вставляется?..

Лично я в таком случае первым делом подключил UPS и выключил FW. Мой тест вставки это ускоряет в три раза.

Ответить