Я использую Firebird 2.1 и я нужна помощь оптимизируя этот запрос: (возможно, путем замены IN-s с JOINS или что-то, чтобы ускорить его, так как это очень медленно)Как оптимизировать этот запрос в Firebird 2.1?
SELECT ClientID, ClientType, ClientName
FROM Clients
WHERE
(
AccessRights = 0 OR
OwnerUserID = :uid OR
(
AccessRights = 2 AND
ClientID IN (SELECT ClientID
FROM ClientRights
WHERE UserID = :uid)
)
)
AND ClientID IN (SELECT CC.ClientID
FROM CaseClients CC
WHERE CC.CaseID IN (SELECT DISTINCT CaseID
FROM TimeSheet
WHERE IsBilled = 0)
AND CC.ClientToBill = 1
AND (SELECT BillingType
FROM Cases
WHERE CaseID = CC.CaseID) = 2
);
Спасибо!
Вы уже добавили индексы в поля, которые вы запрашиваете, чтобы ускорить все это? – Iridio
Я не могу говорить за firebird, но я знаю, что в некоторых реализациях использование EXISTS вместо IN быстрее. – Malachi
Я знаю, что на SQL-сервере оптимизатор обычно лучше работает с 'AND', чем предикаты' OR', и иногда можно повысить производительность, преобразуя 'OR' в логически эквивалентную' AND' –