2016-04-21 5 views
0

Все,SQLITE: Оптимизируйте ORDER BY Query

Я - разработчик iOS. В настоящее время мы сохранили 2,5 недостатка данных в базе данных. И на этом мы реализовали функцию поиска. Ниже приведен запрос, который мы используем.

select CustomerMaster.CustomerName ,CustomerMaster.CustomerNumber, 
    CallActivityList.CallActivityID,CallActivityList.CustomerID,CallActivityList.UserID, 
    CallActivityList.ActivityType,CallActivityList.Objective,CallActivityList.Result, 
    CallActivityList.Comments,CallActivityList.CreatedDate,CallActivityList.UpdateDate, 
    CallActivityList.CallDate,CallActivityList.OrderID,CallActivityList.SalesPerson, 
    CallActivityList.GratisProduct,CallActivityList.CallActivityDeviceID, 
    CallActivityList.IsExported,CallActivityList.isDeleted,CallActivityList.TerritoryID, 
    CallActivityList.TerritoryName,CallActivityList.Hours,UserMaster.UserName, 
    (FirstName ||' '||LastName) as UserNameFull,UserMaster.TerritoryID as UserTerritory 
from 
    CallActivityList 
    inner join CustomerMaster 
     ON CustomerMaster.DeviceCustomerID = CallActivityList.CustomerID 
    inner Join UserMaster 
     On UserMaster.UserID = CallActivityList.UserID 
where 
    (CustomerMaster.CustomerName like '%T%' or 
    CustomerMaster.CustomerNumber like '%T%' or 
    CallActivityList.ActivityType like '%T%' or 
    CallActivityList.TerritoryName like '%T%' or 
    CallActivityList.SalesPerson like '%T%' ) 
    and CallActivityList.IsExported!='2' and CallActivityList.isDeleted != '1' 
order by 
    CustomerMaster.CustomerName 
limit 50 offset 0 

Без использования 'заказать' Запрос возвращает результат в 0,5 секунды. Но когда я прикрепляю «порядок», время увеличивается до 2 секунд.

Я пробовал индексировать, но это не делает заметных изменений. Любой, пожалуйста, помогите. Если мы не будем проходить через Query, то как мы можем сделать это быстро.

Заранее спасибо.

ответ

1

Это связано с лимитом. Без ORDER BY должно быть обработано только 50 записей, и все 50 будут возвращены. С ORDER BY все записи должны быть обработаны, чтобы определить, какие из них являются первыми 50 (по порядку).

Проблема заключается в том, что ORDER BY выполняется на объединенной таблице. Кроме того, вы можете применить лимит на основной таблице (сначала я предполагаю, что это CallActivityList), а затем присоединиться.

SELECT ... 
FROM 
    (SELECT ... FROM CallActivityList ORDER BY ... LIMIT 50 OFFSET 0) AS CAL 
    INNER JOIN CustomerMaster ON ... 
    INNER JOIN UserMaster ON ... 
    ORDER BY ... 

Это снизит затраты на соединение таблиц. Если это невозможно, попробуйте хотя бы соединить CallActivityList с CustomerMaster. Примените предел к ним и, наконец, присоединитесь к UserMaster.

SELECT ... 
FROM 
    (SELECT ... 
    FROM 
     CallActivityList 
     INNER JOIN CustomerMaster ON ... 
    ORDER BY CustomerMaster.CustomerName 
    LIMIT 50 OFFSET 0) AS ActCust 
    INNER JOIN UserMaster ON ... 
ORDER BY ... 

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

+0

Это я знаю, если вы можете помочь мне оптимизировать этот запрос с помощью «Сортировать по». – Nikh1414