Улучшение производительности SQL-запросов

0

У меня есть 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

Я также прочитал, что команда объяснения поможет определить проблемы, но я не понимаю ответа.

Изображение 174551

Есть ли способ увеличить производительность этого запроса?

  • 1
    На какое программное обеспечение SQL вы ориентируетесь?
  • 0
    Если вы посмотрите на свой execution plan , который покажет вам, какие части работают медленно. Без доступа к данным много догадок с нашей стороны. Вы также можете просто добавить все это в Engine Tuning Advisor и посмотреть, что думает SQL (если это MSSQL).
Показать ещё 1 комментарий
Теги:
query-performance

2 ответа

0

Сгиб тест для d.totalfci IS NOT NULL в подзапрос, который его генерирует, даже если он должен быть в предложении HAVING.

Добавьте некоторые индексы

tasks:  INDEX(ClientRef, 'Status', DueDate)
plans:  INDEX(ClientId, CurrentVal)
adviserfci:  INDEX(ClientId)
0

В первую очередь, у вас есть индексы, созданные для этих таблиц?

Не зная ваши структурированные данные и какую нагрузку на запрос, которую вы собираетесь вкладывать в них, сложно сказать, но при первом взгляде я бы сказал, что эти индексы должны повысить производительность, если у вас их еще нет:

  • CRMContactId в списке клиентов таблицы
  • ClientId в табличных планах
  • ClientId на adviserfci (включают IncomeType и Payable)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню