У меня есть запрос в 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
Да. Итак, каков ваш вопрос? Какая из них самая медленная? С какой частью вам нужна помощь, чтобы улучшить? –
В: Для вашего «tby_1_estr», «название» всегда уникально для каждого «кода», или может быть несколько кодов с одинаковым названием. Может быть большой обзор, чтобы упростить ваш запрос. – DRapp
Кроме того, ваши внутренние запросы A-D не ссылаются на ваш net_status .. было это намеренно или нет. Или, СЛЕДУЕТ, эти другие запросы также рассматривают net_Status = 3 тоже? – DRapp