медленный update

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

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

Ответить
bolide
Сообщения: 7
Зарегистрирован: 21 июн 2007, 20:42

медленный update

Сообщение bolide » 21 июн 2007, 20:45

Здравствуйте, коллеги!

Помогите, а то туплю что-то...
Использую 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 тыс записей.
Подскажите, что подкрутить?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

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

Сообщение Merlin » 21 июн 2007, 21:09

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

bolide
Сообщения: 7
Зарегистрирован: 21 июн 2007, 20:42

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

Сообщение bolide » 21 июн 2007, 21:20

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;

bolide
Сообщения: 7
Зарегистрирован: 21 июн 2007, 20:42

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

Сообщение bolide » 21 июн 2007, 23:36

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

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

Сообщение kdv » 22 июн 2007, 10:05

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

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

bolide
Сообщения: 7
Зарегистрирован: 21 июн 2007, 20:42

Сообщение bolide » 22 июн 2007, 10:15

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

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 22 июн 2007, 10:24

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

bolide
Сообщения: 7
Зарегистрирован: 21 июн 2007, 20:42

Сообщение bolide » 22 июн 2007, 10:30

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 24 июн 2007, 14:31

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

Ответить