2014-12-22 3 views
-3

У меня есть запрос в sql, как показано ниже, на что требуется 40 минут!Как улучшить стоимость объединенных запросов

Любые рекомендации по настройке этого будут оценены.

select  
     QA.*, 
     QB.Tedade_Forushe_Ensheab 
    from 
    ((SELECT 
       dbo.MiladiTOShamsi(GETDATE()) AS CURENT_DATE, 
       '93/01/15' AS F_DATE, 
       '93/01/20' AS T_DATE, 
       E.title, 
       E.code as EsterCode, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.req_date, M.install_date)) AS TOTAL_DAY, 
       COUNT(*) AS CNT, 
       COUNT(R.req_seq) AS Req_seq_Count, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.req_date, R.actv_date))/COUNT(*) AS AVR_1, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.visit_date, R.actv_date))/COUNT(*) AS AVR_2, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.pay_date, R.actv_date))/COUNT(*) AS AVR_3, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.visit_date, R.pay_date))/COUNT(*) AS AVR_4, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.req_date, R.visit_date))/COUNT(*) AS AVR_5, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.req_date, R.pay_date))/COUNT(*) AS AVR_6, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.actv_date, R.create_actv_date))/COUNT(*) AS AVR_7, 
       SUM(dbo.fn_ShamsiDateStrDiffDay(R.actv_date, M.first_date))/COUNT(*) AS AVR_8 
      FROM 
       tby_1_request AS R 
       INNER JOIN y_1_tariff AS T 
        ON R.tariff_type = T.tariff 
       INNER JOIN tby_1_meter AS M 
        ON R.cust_id = M.cust_id 
       INNER JOIN tby_1_estr AS E 
        ON R.estr = E.code 
      WHERE 
        R.net_status = 3 
       AND R.actv_date >= '93/01/15' 
       AND R.actv_date <= '93/01/20' 
       AND R.pay_date >= '93/01/15' 
       AND R.pay_date <= '93/01/20' 
      GROUP BY 
       E.title, 
       E.code) AS QA 

     left join 
     (Select 
       A.*, 
       B.Tedade_Forushe_Ensheab, 
       C.Tedade_Nasbfrom, 
       D.Tedade_ijade_sabegeh 
      from 
       (select distinct Estr.title 
        from tby_1_request Req 
         INNER JOIN tby_1_estr AS Estr 
         ON Req.estr = Estr.code 
         INNER JOIN y_1_tariff AS T 
         ON Req.tariff_type = T.tariff 
         INNER JOIN tby_1_meter AS M 
         ON Req.cust_id = M.cust_id 
        group by 
         Estr.title, 
         Estr.code, 
         Req.pay_date, 
         Req.net_status, 
         Req.actv_date 
        having 
          Req.net_status = 3 
         AND Req.actv_date >= '93/01/15' 
         AND Req.actv_date <= '93/01/20' 
         AND Req.pay_date >= '93/01/15' 
         AND Req.pay_date <= '93/01/20') AS A 

     left join 
     (select 
       Estr.title, 
       COUNT(CASE WHEN Pay_date IS NOT NULL AND Req.pay_date >= '93/01/15' AND Req.pay_date <= '93/01/20' 
          THEN 1 ELSE NULL END) AS Tedade_Forushe_Ensheab 
      from 
       tby_1_request Req 
       INNER JOIN tby_1_estr AS Estr 
        ON Req.estr = Estr.code 
      group by 
       Estr.title, 
       Estr.code) AS B 
      ON A.title = B.title 


     left join 
     (select 
       Estr.title, 
       COUNT(CASE WHEN actv_date IS NOT NULL AND Req.actv_date >= '93/01/15' AND Req.actv_date <= '93/01/20' 
          THEN 1 ELSE NULL END) AS Tedade_Nasbfrom 
      from 
       tby_1_request Req 
       INNER JOIN tby_1_estr AS Estr 
        ON Req.estr = Estr.code 
      group by 
       Estr.title, 
       Estr.code) AS C 
      ON A.title = C.title 


     left join 
     (select 
       Estr.title, 
       COUNT(CASE WHEN create_actv_date IS NOT NULL AND Req.create_actv_date >= '93/01/15' AND Req.create_actv_date <= '93/01/20' 
          THEN 1 ELSE NULL END) AS Tedade_ijade_sabegeh 
      from 
       tby_1_request Req 
       INNER JOIN tby_1_estr AS Estr 
        ON Req.estr = Estr.code 
      group by 
       Estr.title, 
       Estr.code) AS D 
      ON A.title = D.title) AS QB 
     On QA.title = Qb.title 
+0

Да. Итак, каков ваш вопрос? Какая из них самая медленная? С какой частью вам нужна помощь, чтобы улучшить? –

+0

В: Для вашего «tby_1_estr», «название» всегда уникально для каждого «кода», или может быть несколько кодов с одинаковым названием. Может быть большой обзор, чтобы упростить ваш запрос. – DRapp

+0

Кроме того, ваши внутренние запросы A-D не ссылаются на ваш net_status .. было это намеренно или нет. Или, СЛЕДУЕТ, эти другие запросы также рассматривают net_Status = 3 тоже? – DRapp

ответ

0

Я редактировал исходный SQL-запрос только для удобства чтения. Я перестроился, казалось, пропустил двойной открытый паран для внутренних запросов A-D слева.

Кроме того, не зная табличных структур или доступных индексов, я бы обеспечил вашу таблицу tby_1_request, у вас есть указатель на (net_status, actv_date, pay_date), чтобы помочь в ваших критериях WHERE. Кроме того, для ваших запросов B, C и D для подсчетов я бы включил индивидуальные индексы (pay_date, estr), (act__date, estr) и (create_actv_date, estr)

Ищите немного ближе, вы также получаете Декартовский результат, который, вероятно, убивает вас, поскольку ваши запросы сгруппированы по названию и коду, но вы присоединяетесь только к столбцу заголовка.

Смежные вопросы