Медленные вставки при использовании триггеров SQLite - PullRequest
1 голос
/ 30 декабря 2011

У меня есть небольшая база данных во встроенной системе с несколькими таблицами, которые я хочу ограничить до 1000 строк. Для этого я настроил триггер, который выполняется после каждой вставки новой строки. Код триггера:

CREATE TRIGGER after_insertion_trigger
AFTER INSERT ON table
BEGIN
    DELETE FROM table
    WHERE uuid IN (
        SELECT uuid FROM table ORDER BY sent ASC, timestamp DESC LIMIT -1 OFFSET 1000
    );
END;

Проблема в том, что вставки в полную таблицу при использовании триггеров занимают более 3 минут каждый вместо 0,4 секунд, что является временем, необходимым для завершения обычной транзакции вставки и удаления предложений.

Время, необходимое для выполнения вставки при использовании триггеров, похоже, увеличивается по мере увеличения количества строк в базе данных.

Я нашел много разных тем в Stack Overflow и других сетях о триггерах, но ни одна из них не помогла мне решить проблему. Я использую SQLite 3.7.9.

Кто-нибудь знает, почему у меня такая низкая производительность? Мне не нужна огромная производительность, потому что вставки происходят не очень часто, но 3 минуты для вставки недопустимы.

1 Ответ

3 голосов
/ 30 декабря 2011

Наконец-то я обнаружил, в чем проблема.

Триггеры были очень медленными, потому что поле 'uuid' не было индексом (схема базы данных не была оптимизирована). После установки поля 'uuid' в качестве первичного ключа вставки теперь занимают около 0,7 секунд.

Это показывает, насколько важны индексы внутри триггеров, но я до сих пор не понимаю, почему производительность такая низкая. Я думаю, что я должен взглянуть на реализацию триггеров SQLite, чтобы выяснить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...