Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Как можно оптимизировать запрос выборки по двум датам из БД Sqlite?  [new]
AntonSol
Member

Откуда:
Сообщений: 37
Составил запрос по выборки максимальных значений из двух полей с датами, используя несколько связанных таблиц:
SELECT mes.measureCommFromTab, p.XMLizmerenije, p.XMLdatetime, p.measureComm_id 
FROM `xmlmessagetab` p 
INNER JOIN `indexobjectstab` ps 
ON ps.keyID = p.indexObjectsTab_id 
INNER JOIN `measurecommtab` mes 
ON mes.keyID = p.measureComm_id 
WHERE ps.indexObject = '55285' 
AND p.XMLdatetime = (SELECT max(p.XMLdatetime) 
FROM `xmlmessagetab` p 
INNER JOIN `indexobjectstab` ps 
ON ps.keyID = p.indexObjectsTab_id 
WHERE ps.indexObject = '55285' ) 
AND p.datetimeMess = (SELECT max(p.datetimeMess) FROM `xmlmessagetab` p INNER JOIN `indexobjectstab` ps ON ps.keyID = p.indexObjectsTab_id WHERE ps.indexObject = '55285' )


Запрос выполняется две с половиной минуты, что не выносимо долго:(
1. Подскажите пожалуйста, может быть есть способ оптимизировать данный запрос?
2. Есть план "Б", при записи данных в БД, дублировать последнюю дату поля "XMLdatetime" и потом использовать её для составления запроса на выборку по последней дате, что скажете об этом варианте?
7 дек 18, 07:48    [21756584]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос выборки по двум датам из БД Sqlite?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Прежде чем сюда постить неплохо бы сначала отформатировать
SELECT mes.measureCommFromTab, p.XMLizmerenije, p.XMLdatetime, p.measureComm_id 
   FROM `xmlmessagetab` p 
            INNER JOIN `indexobjectstab` ps ON ps.keyID = p.indexObjectsTab_id 
            INNER JOIN `measurecommtab` mes ON mes.keyID = p.measureComm_id 
   WHERE ps.indexObject = '55285' 
           AND p.XMLdatetime = (SELECT max(p.XMLdatetime) 
                       FROM `xmlmessagetab` p 
                              INNER JOIN `indexobjectstab` ps ON ps.keyID = p.indexObjectsTab_id 
                       WHERE ps.indexObject = '55285' 
              ) 
          AND p.datetimeMess = (SELECT max(p.datetimeMess) 
                                   FROM `xmlmessagetab` p INNER JOIN `indexobjectstab` ps ON ps.keyID = p.indexObjectsTab_id 
                                   WHERE ps.indexObject = '55285' 
                                  )

Надо индексы:
1. indexobjectstab.indexObject
2. xmlmessagetab.indexObjectsTab_id
3. measurecommtab.keyID

ИМХО подзапросы можно отдельно выполнить, а результат в основной запрос подставлять.
7 дек 18, 08:02    [21756591]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос выборки по двум датам из БД Sqlite?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Если подзапросы считать отдельно, то можно их объединить
SELECT max(p.XMLdatetime), max(p.datetimeMess) 
                       FROM `xmlmessagetab` p 
                              INNER JOIN `indexobjectstab` ps ON ps.keyID = p.indexObjectsTab_id 
                       WHERE ps.indexObject = '55285' 
7 дек 18, 08:17    [21756600]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить