Как я могу улучшить производительность sqlite с большой таблицей? - PullRequest
0 голосов
/ 02 мая 2019

SQlite DB с одной таблицей и 60 000 000 записей.время выполнения простого запроса составляет более 100 секунд.
Я пытался перейти на postgeSQL, но его производительность была еще ниже.Не тестировал его на MySQL или msSQL.
Оболочка Я разделил таблицу (скажем, разные таблицы для каждого pointID - их несколько сотен? Или разные таблицы для каждого месяца - тогда у меня будет максимум 10 000 000 записей?)

sql схема:

CREATE TABLE `collectedData` (
    `id`    INTEGER,
    `timeStamp` double,
    `timeDateStr`   nvarchar,
    `pointID`   nvarchar,
    `pointIDindex`  double,
    `trendNumber`   integer,
    `status`    nvarchar,
    `value` double,
    PRIMARY KEY(`id`)
);

CREATE INDEX `idx_pointID` ON `collectedData` (
    `pointID`
);

CREATE INDEX `idx_pointIDindex` ON `collectedData` (
    `pointIDindex`
);

CREATE INDEX `idx_timeStamp` ON `collectedData` (
    `timeStamp`
);

CREATE INDEX `idx_trendNumber` ON `collectedData` (
    `trendNumber`
);

Следующий запрос занял 107 секунд:

select * from collectedData 
where 
trendNumber =1 
and status <> ''  and 
timestamp <=1556793244 
and pointid in ('point1','point2','pont3','point4','point5','point6','point7','point8','point9','pointa') 
and pointIDindex % 1 = 0  
order by timestamp desc, id desc limit 5000

следующий запрос занял 150 секунд (меньше условий)

select * from collectedData 
where 
trendNumber =1 
and status <> ''  and 
timestamp <=1556793244 
and pointIDindex % 1 = 0  
order by timestamp desc, id desc limit 5000

Редактирование: Asnwer из другого места - добавьте следующий индекс:

CREATE INDEX idx_All ON collectedData (trendNumber, pointid, pointIDindex, status, timestamp desc, id desc, timeDateStr, value)

улучшил производительность в 3 раза.

Редактирование # 2: предложение @Raymond Nijland: исполнениеПлан такой: ПОИСК ТАБЛИЦЫ ПАРАМЕТРОВ С ИСПОЛЬЗОВАНИЕМ ПОКРЫТИЯ ИНДЕКСА idx_All (trendNumber =? AND pointID =?) "" 0 "" 0 "" 0 "" ВЫПОЛНИТЬ СПИСОК СПИСОК 1 "" 0 "" 0 "" 0 "" ИСПОЛЬЗОВАТЬ ТЕМП. Б-ДЕРЕВОЗАКАЗАТЬ ПО "

и благодаря ему - используя эти данные, я изменил порядок правил в запросе на следующий:

select * from (
select * from collectedData 
where 
trendNumber =1 
and status <> ''  and 
timestamp <=1556793244 
and pointid in ('point1','point2','pont3','point4','point5','point6','point7','point8','point9','pointa') 

and pointIDindex % 1 = 0  
order by id desc limit 5000
) order by timestamp desc

это значительно улучшилось (дляменя это решило).

1 Ответ

1 голос
/ 04 мая 2019

После того, как @RaymondNijland предложил мне проверить план выполнения, я изменил запрос на:

select * from (
select * from collectedData 
where 
trendNumber =1 
and status <> ''  and 
timestamp <=1556793244 
and pointid in ('point1','point2','pont3','point4','point5','point6','point7','point8','point9','pointa') 

and pointIDindex % 1 = 0  
order by id desc limit 5000
) order by timestamp desc

Этот запрос дает такие же результаты, как и другой, но не в 120 раз быстрее (уменьшениеколичество записей перед сортировкой).

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