Страница 1 из 1

медленный update

Добавлено: 21 июн 2007, 20:45
bolide
Здравствуйте, коллеги!

Помогите, а то туплю что-то...
Использую FIBPlus для доступа к Firebird Embedded.
Есть таблица, 230 тысяч записей, 5 полей числовых.
Надо пробежать по всем записям и в зависимости от условий изменить
два поля в каждой записи.
Без сохранения значений этих полей процесс занимает полторы минуты, с
сохранением - около 11 часов (как предсказывает программа).

Добавляю из FIBQuery:

DM.UniQ3.Transaction.StartTransaction;
DM.UniQ3.SQL.Text := 'UPDATE RESULTS SET IMAGEMARK1 = :IMAGEMARK1, IMAGEMARK2 = :IMAGEMARK2 WHERE ID = :ID';
DM.UniQ3.Prepare;

и потом

(*) DM.UniQ3.ExecWP([NewMark1,NewMark2,DM.UniQ4.Fields[0].AsInteger]);

после всего ещё и

DM.UniQ3.Transaction.Commit;

Если закоментить строку (*), то всё летает... Сделал вывод, что
неправильно делаю апдейт, но не понимаю, где именно. Складывается
ощущение, что коммит происходит на каждой из 230 тыс записей.
Подскажите, что подкрутить?

Re: медленный update

Добавлено: 21 июн 2007, 21:09
Merlin
bolide писал(а): Складывается
ощущение, что коммит происходит на каждой из 230 тыс записей.
Подскажите, что подкрутить?
В пропертях компонента транзакции? Не знаю как оно в плюсАх зовётся и что там насчёт автокоммита накручено. А ещё - эти имиджмарки часом не проиндексированы?

Re: медленный update

Добавлено: 21 июн 2007, 21:20
bolide
Merlin писал(а):В пропертях компонента транзакции? Не знаю как оно в плюсАх зовётся и что там насчёт автокоммита накручено.
Да там и пропертей то почти нету. Автокоммит есть в FIBQuery, отключен. Есть непонятный TPBMode (tpbDefault, tpbReadCommitted, tpbRepeatableRead) - менял значения, не помогает.
Merlin писал(а): А ещё - эти имиджмарки часом не проиндексированы?
Проиндексированы, но я убиваю индексы перед тем, как бежать по записям:

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

    DM.UniQ3.Transaction.StartTransaction;
    DM.UniQ3.SQL.Text           := 'DROP INDEX IMAGEMARK1_IND;';
    DM.UniQ3.ExecQuery;
    DM.UniQ3.SQL.Text           := 'DROP INDEX IMAGEMARK2_IND;';
    DM.UniQ3.ExecQuery;
    DM.UniQ3.Transaction.Commit;

Re: медленный update

Добавлено: 21 июн 2007, 23:36
bolide
Нашёл проблему. Забыли ID сделать первичным ключом. Всё перерыл, пока не глянул стейтмент создания таблиц. Проблема была совсем рядом, вобщем, а не там, где я её искал :)

Добавлено: 22 июн 2007, 10:05
kdv
Есть непонятный TPBMode (tpbDefault, tpbReadCommitted, tpbRepeatableRead) - менял значения, не помогает.
гм. обнаглели совсем. на Firebird пишут, а про транзакции ни в зуб ногой.

www.ibase.ru/devinfo/ibtrans.htm
www.ibase.ru/devinfo/ibx.htm

Добавлено: 22 июн 2007, 10:15
bolide
kdv писал(а):гм. обнаглели совсем. на Firebird пишут, а про транзакции ни в зуб ногой.
www.ibase.ru/devinfo/ibtrans.htm
www.ibase.ru/devinfo/ibx.htm
:?

Я всё хочу постепенно отойти от программирования и использовать наёмный труд, да пока выходит с трудом :) Приходится всё равно самому во всём разбираться.
За ссылки спасибо, пойду читать

Добавлено: 22 июн 2007, 10:24
stix-s
bolide писал(а): Я всё хочу постепенно отойти от программирования и использовать наёмный труд, да пока выходит с трудом :) Приходится всё равно самому во всём разбираться.
За ссылки спасибо, пойду читать
Хм, наемный труд? а как ты квалификацию наемного работника определишь? Если даже хелп по используемым компонентам не читаешь?

Добавлено: 22 июн 2007, 10:30
bolide
stix-s писал(а): Хм, наемный труд? а как ты квалификацию наемного работника определишь? Если даже хелп по используемым компонентам не читаешь?
Квалификацию - по первым результатам труда. Хелп должен читать работник, а не я :) Мне должно хватать общего представления. Плюс эдакое чутьё... Вот чувстовал я, что не должна операция выполняться 11 часов, должно хватить несколько минут. Пришлось копать... Кажется, потихоньку тема переходит в оффтопик. Можно её закрывать, проблема решена, помощь в виде ссылок получена :) Спасибо!

Добавлено: 24 июн 2007, 14:31
CyberMax
Обновил тему "Обязательно прочитать перед заданием вопроса!": добавил постскриптум.
Мда, поле ID, не указанное как PK - это оригинально :roll:.