2016-02-01 3 views
0

У меня есть следующий запрос, что он работает нормально, но требуется время. И стол становится все больше и больше, поэтому требуется больше времени. Есть ли способ ускорить этот запрос? Запрос здесь:Сделать запрос SQL быстрее, чем

SELECT  patient.bartar_id, patient.bartar_enteringthesystem, patient.bartar_proviencename, patient.bartar_cityname, patient.bartar_coloplastrepname, patient.bartar_consultorname, 
        patient.bartar_provienceofsurgeryname, patient.bartar_cityofsurgeryname, patient.bartar_surgeryhospitalname, patient.bartar_doctorsname, patient.bartar_patientstatusname, patient.bartar_ostomytypename, 
        patient.bartar_insurancetypename, patient.bartar_ostomytimename, patient.bartar_dateofseurgery, patient.bartar_deathhealeddate, patient.bartar_customercode, patient.bartar_name, patient.bartar_family, 
        patient.bartar_age, patient.bartar_birthyear, patient.bartar_connectornursename, patient.bartar_hastakmiliname, patient.bartar_doctorsname AS Expr1, patient.bartar_patientstatusname AS Expr2, 
        patient.bartar_generalstatusname, patient.new_description AS CCDesc, patient.bartar_visitname, patient.bartar_repvisitname, patient.bartar_salename, patient.bartar_customersstatusname, r.bartar_date, 
        r.bartar_delay, r.bartar_nextcall, r.new_newcaller, r.bartar_bagPerMonth, r.bartar_brand, r.bartar_paste, r.bartar_bag, r.bartar_acc, r.bartar_insuranceinfo, r.bartar_pastePerMonth 
FROM   Filteredbartar_newpaitient AS patient INNER JOIN 

, а остальное здесь:

(SELECT DISTINCT bartar_patientname, 
(SELECT  TOP (1) bartar_date 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_date IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_date, 
(SELECT  TOP (1) bartar_delay 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_delay IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_delay, 
(SELECT  TOP (1) bartar_nextcall 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_nextcall IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_nextcall, 
(SELECT  TOP (1) new_newcaller 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (new_newcaller IS NOT NULL) 
ORDER BY bartar_date DESC) AS new_newcaller, 
(SELECT  TOP (1) bartar_brandname 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_brand IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_brand, 
(SELECT  TOP (1) bartar_pastename 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_paste IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_paste, 
(SELECT  TOP (1) bartar_bagname 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_bag IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_bag, 
(SELECT  TOP (1) bartar_accname 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_acc IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_acc, 
(SELECT  TOP (1) bartar_pastepermonth 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_pastepermonth IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_pastePerMonth, 
(SELECT  TOP (1) bartar_bagepermonth 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_bagepermonth IS NOT NULL) 
ORDER BY bartar_date DESC) AS bartar_bagPerMonth, 
(SELECT  TOP (1) bartar_insuranceinfoname 
FROM   Filteredbartar_callcenterreport AS c2 
WHERE  (bartar_patientname = cte.bartar_patientname) AND (bartar_insuranceinfo IS NOT NULL)ORDER BY bartar_date DESC) AS bartar_insuranceinfo 
          FROM   Filteredbartar_callcenterreport AS cte) AS r ON r.bartar_patientname = patient.bartar_newpaitientid 
          --where patient.bartar_enteringthesystem > @Fromdate and patient.bartar_enteringthesystem < @Todate 
ORDER BY patient.bartar_enteringthesystem ASC 
+0

время является около 4:30 мин. – Morteza

+0

Похож на очень плохой запрос. С таким количеством подзапросов вам определенно нужен новый дизайн БД/запросов. – i486

+1

Я не могу понять, почему у вас так много подзапросов, когда вы можете использовать объединения для получения данных с использованием идентификаторов. там не нужно «TOP (1)», если вы использовали PK для поиска записей. – Takarii

ответ

1

Избавьтесь от верхней 1 суб
просто присоединиться или влево присоединиться

min(bartar_date)... 
from 
group by bartar_patientname 
+0

Опишите это больше, я не получил вашего ответа. Tnx – Morteza

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