У меня есть SQL-запрос, который извлекает данные из нескольких таблиц. Единственная проблема, с которой я столкнулась, - это действительно вопрос, который длится долго, и мне было интересно, есть ли способ ускорить его. Я сделал некоторые незначительные улучшения, используя INNER JOIN, а не LEFT JOIN, но запрос должен замедляться.
SELECT
clientlist.CRMContactId,
clientlist.ClientAdviser,
COALESCE(NULLIF(clientlist.FirstName, ""), clientlist.CorporateName) AS FirstName,
clientlist.LastName,
clientlist.ServiceStatusName,
FORMAT(t.totalfum, 2) AS "Funds Under Management",
FORMAT(d.totalfci, 2) AS "Total Income",
(SELECT DueDate
FROM tasks
WHERE ClientRef = clientlist.ClientRef
AND 'Status' <> "Complete"
ORDER BY DueDate DESC
LIMIT 1) AS NextDate,
(SELECT CompletedDate
FROM tasks
WHERE ClientRef = clientlist.ClientRef
AND 'Status' = "Complete"
ORDER BY DueDate DESC
LIMIT 1) AS LastDate
FROM
clientlist
INNER JOIN
(SELECT
plans.ClientId, SUM(plans.CurrentVal) AS totalfum
FROM
plans
GROUP BY
plans.ClientId) t ON clientlist.CRMContactId = t.ClientId
INNER JOIN
(SELECT
adviserfci.ClientId, SUM(adviserfci.Payable) AS totalfci
FROM
adviserfci
WHERE
IncomeType IN ("Renewal Commission", "Ongoing Fee", "Fund Based Commission")
OR (Incometype = "Payaway Received"
AND UnderlyingIncomeType IN ("Renewal", "Ongoing Fee", "Fund Based"))
GROUP BY
adviserfci.ClientId) d ON clientlist.CRMContactId = d.ClientId
WHERE
d.totalfci IS NOT NULL
Я также прочитал, что команда объяснения поможет определить проблемы, но я не понимаю ответа.
Есть ли способ увеличить производительность этого запроса?
Сгиб тест для d.totalfci IS NOT NULL
в подзапрос, который его генерирует, даже если он должен быть в предложении HAVING
.
Добавьте некоторые индексы
tasks: INDEX(ClientRef, 'Status', DueDate)
plans: INDEX(ClientId, CurrentVal)
adviserfci: INDEX(ClientId)
В первую очередь, у вас есть индексы, созданные для этих таблиц?
Не зная ваши структурированные данные и какую нагрузку на запрос, которую вы собираетесь вкладывать в них, сложно сказать, но при первом взгляде я бы сказал, что эти индексы должны повысить производительность, если у вас их еще нет:
Если вы еще не настроили первичные ключи таблицы, и из названий столбцов они звучат как приличные ключи кандидата, поэтому, если это работает, вы можете убить двух зайцев одним выстрелом.
execution plan
, который покажет вам, какие части работают медленно. Без доступа к данным много догадок с нашей стороны. Вы также можете просто добавить все это вEngine Tuning Advisor
и посмотреть, что думает SQL (если это MSSQL).