Здравствуйте, и новый год,SQLite и проблема с производительностью с SELECT total (value)
Мы по-прежнему боремся с нашим применением моделирования. Особенно при использовании SQLite в качестве таблицы поиска в режиме реального времени во время работы.
Позвольте мне показать вам дизайн таблицы первой: SQLfiddle - Link
Здесь вы можете увидеть таблицу 'TESTTABLE' с:
- 'ид' (целое число): в качестве первичного ключа
- 'time_abs' (integer): представляет временную метку, связанную с синхронизацией моделирования.
- 'r_m' (double): обозначает 'массовый расход' (единица измерения кг/с, например) некоторого расхода
- «T_r» (двойной): означает «температура массового расхода»
- «тип» (varchar): обозначает вид массового расхода (например, вода)
- 'х0' (VARCHAR): представляет собой отход от массового потока (например, сосуд # 1)
- 'x1' (VARCHAR): представляет собой место назначения потока массы (например, сосуд # 2)
(на самом деле есть еще некоторые химические и физические свойства, записанные в эту таблицу)
моделирование создает эти данные, и написано с Java методов в базу данных, которая работает довольно хорошо (несколько 10к/с возможно).
Этот вопрос:
Во время моделирования работы двигателя моделирования когда-то нуждается в определенной информации, как «Какова общая масса в vessel1 во время 14?» Мы получаем эту информацию с запросом, как это:
SELECT total(r_m) FROM testtable WHERE time_abs<=14 AND x1='vessel2') - (SELECT total(r_m) FROM testtable WHERE time_abs<=14 AND x0='vessel2');
(, которая: добавление все ставки дохода и вычитая все ставки исходов в одной локальной точке)
, который работает нормально в начале. Но в итоге у нас около 8-10 миллионов строк в этой таблице, и производительность сильно падает. Например. этот запрос занимает почти 6 секунд (3-4 секунды с мангистом SQLite в firefox).
Также в конце мы хотели бы построить общую массу за период 1000 единиц времени (time_abs) с этим запросом, который понадобится около 1000 * 6 секунд. Очевидно, много.
Итак, вопрос в том, что мы можем сделать, чтобы значительно увеличить производительность?
вам нужно только последние 14 временную метку? – PeterRing
Не все «time_abs» меньше, чем «время поиска». Кроме того, timestamp 'time_abs' не уникален из-за одновременных процессов. Поэтому в примере запроса один не может сказать, сколько запросов времени запрошено, так как количество параллельных процессов является переменной. – StefanOverFlow
(по «параллельным процессам». Я имею в виду процессы в моделированном процессе, которые не одновременно обращаются к SQLite, только для уточнения). – StefanOverFlow