powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Несколько команд в цикле
4 сообщений из 4, страница 1 из 1
Несколько команд в цикле
    #37285631
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обнаружил такой косяк в приложении mmex - Менеджер личных финансов.

Если отметить более чем пару десятков троводок на удаление и дать команду удалить, то программа по циклу начинает удалять их по id
delete from CHECKINGACCOUNT_V1 where TRANSID = idx
delete from SPLITTRANSACTIONS_V1 where TRANSID = idx

Работает это очень медленно, несколько секунд. Но что интересно, что когда цикл заканчивается, ещё долго шуршит винчестер (секудн 10 не меньше).

Я переделываю код на что-то вроде
delete from CHECKINGACCOUNT_V1 where TRANSID in ( id1, id2,...)
Так работает быстро. Но грамотно этот код я пока переделать не могу.

Аналогичная проблема при импорте из, например, csv. Понятно, что парсится файл и производится несколько insert. Чтобы вставить 200 строк уходит секунд 15 (на не старом ноуте).

Может тюнинг БД какой-то может помочь как временное решение.

Заранее спасибо.
...
Рейтинг: 0 / 0
Несколько команд в цикле
    #37285734
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Команды надо заключать в транзакцию.
...
Рейтинг: 0 / 0
Несколько команд в цикле
    #37285949
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как просто! СПАСИБО!

Добавил до и после цикла процедуры (или фунции, не знаю как правильно)
Теперь глазом моргнуть не успеешь - уже всё удалено.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
+			mmDBWrapper::begin(m_core->db_.get());
            for (size_t i =  0 ; i < m_trans.size(); ++i)
            {
               if (m_trans[i]->status_ == wxT("F"))
               {
                  m_core->bTransactionList_.deleteTransaction(m_AccountID, m_trans[i]->transactionID());
               }
            }
+			mmDBWrapper::commit(m_core->db_.get());

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
bool mmDBWrapper::begin(wxSQLite3Database* db)
{
        wxSQLite3Statement st = db->PrepareStatement("BEGIN");
        st.ExecuteUpdate();
        st.Finalize();
        return true;
}

bool mmDBWrapper::commit(wxSQLite3Database* db)
{
        wxSQLite3Statement st = db->PrepareStatement("COMMIT");
        st.ExecuteUpdate();
        st.Finalize();
        return true;
}
...
Рейтинг: 0 / 0
Несколько команд в цикле
    #37294173
Ciirkunst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maximand,

Полезно, Спасибо
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Несколько команд в цикле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]