Улучшено время SQLite Query, две таблицы с внешним ключом - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть две таблицы: RX_PACKETS_TABLE (T1), RX_EVENTS_TABLE (T2). У обоих есть idx. T2 также имеет внешний ключ для T1 idx. CREATE TABLE RX_PACKETS_TABLE (целое число p_idx по умолчанию 0, ограничение первичного ключа pk_RX_PACKETS_TABLE (p_idx))

CREATE TABLE RX_EVENTS_TABLE (целое число e_idx по умолчанию 0, первичный ключ p_idx 100 * *) 1004 * строки T2 сортируются в порядке возрастания по idx и внешнему ключу. Например, T2 может хранить эти строки: e_idx, p_idx 1, 1 2, 1 3, 2 4, 3 4, 4 ...

Размер T2 приблизительно (размер T1) X 5. Система работает на HW с ограниченными ресурсами. Я провел несколько экспериментов, и выборка последних 100 соединенных строк, когда T1 имеет строки 500K, занимает слишком много времени.

Я использовал разные запросы, один с операцией JOIN, другой с проверкой условия «in» для подзапроса, оба дали мои примерно одинаковые результаты. Насколько я понимаю, проблема в том, что движок SQLite не использует тот факт, что T2 сортируется и не оптимизирует JOIN / тест условия «IN». из-за этого он проверяет каждую строку T2 с условием JOIN / "IN".

Если я просто получаю последние 100 строк T2, время запроса значительно уменьшается (1 мс против 1000 мс). Я подумал о двух решениях моей проблемы: 1. буферизовать данные и сгруппировать их перед записью в БД. это добавит некоторую задержку к данным, доступным в БД, но это не очень важно. 2. Напишите лучший запрос и каким-то образом воспользуйтесь тем, что T2 сортируется по обоим полям, но я не знаю точно, как это сделать.

Что вы думаете?

1 Ответ

0 голосов
/ 24 февраля 2020

Мой друг предложил создать индекс в поле p_idx T2. После этого время запроса значительно сократилось с 1700 мс до 1 мс.

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